2017-11-03 8 views
0

비교할 전자 메일 데이터가 있습니다. 데이터를 수집하려면 별도의 테이블에서 보내기, 배달, 열기 등을해야했기 때문에 본질적으로 동일한 정보가있는 5 개의 데이터 프레임이 있지만 보내기 테이블에는 메일로 발송 된 사용자 ID가 100 % 있습니다. 게재, 열림 등의 테이블에는 정확히 동일한 변수/열이 포함되지만 이메일을 보낸 모든 사람이 열거 나 클릭하지 않았기 때문에 행의 수가 적거나 적습니다.R : 누락 된 값에 대해 두 테이블의 열을 비교하고 새 열에 True False를 생성합니다.

내가 원하는 것 이 모든 것을 전송 된 데이터 프레임에 결합하여 각 사용자에 대해 사용자가 전자 메일을 받았는지, 열 었는지, 클릭했는지, 사용자 ID가 후속 테이블에 있는지 여부를 비교하여 Y/N이있는 새 열을 만듭니다. 일종의 준결합입니다. 그러나 첫 번째 테이블에 고유 한 USER ID가 다른 테이블에 존재하는지 여부를 나타내는 새로운 열을 만들고 싶습니다. 간단한 예를 들어, 아래의 두 테이블 각각에서 첫 번째 열이 있습니다.

Sent  USER ID 1 3 17 26 35 124 
      Deliv? Y N Y N Y Y 
Delivered USER ID 1 17 35 124 

mutate와 일치하는 항목을 사용하려고했으나 ifelse와 함께 시도했지만 지금까지는 주사위가 없습니다.

감사합니다.

답변

0

다음을 시도해보십시오.

x <- scan(text = "1 3 17 26 35 124") 
y <- scan(text = "1 17 35 124") 
z <- factor(x %in% y, labels = c("N", "Y")) 
z 
#[1] Y N Y N Y Y 
#Levels: N Y 

물론 변수 이름은 다릅니다. 그러나 방법은 이것입니다.

EDIT.
factor의 결과를 원하지 않으면 다른 방법이 있습니다. 대신 TRUE/FALSE의는 여러 가지 방법으로 진 정수로 논리 값을 변환하는 것이 가능

z2 <- c("N", "Y")[(x %in% y) + 1L] 
z2 
#[1] "Y" "N" "Y" "N" "Y" "Y" 

편집 2.
참고. 더 읽기 쉬운 사람은 as.integer을 사용하는 것입니다.

z <- factor(as.integer(x %in% y), labels = c("N", "Y")) 

[다른 두 가지 방법이 제로를 추가하거나 하나 곱, 해킹 있습니다. (x %in% y) + 0L 또는 (x %in% y)*1L]을

그런 다음이 결과로 data.frame sent에 새 열을 만들 것입니다.

sent$Deliv <- z # or z2 

또는 더 간단하게는 중간 변수 z (또는 z2)를 만들고 직접 factor(...)를 할당하지 않습니다.

sent$Deliv <- factor(as.integer(x %in% y), labels = c("N", "Y")) 
+0

제안 해 주셔서 감사합니다. 여기서 언급해야 할 유일한 도전은 내가 800K 레코드로 작업한다는 것입니다. 따라서 하나씩 값을 입력 할 수는 없습니다. 열의 이름을 지정할 수있을 때이 작업을 수행 할 수있는 방법이 있습니까? 아니면 적어도 벡터로 끌어 와서 그런 식으로 작업할까요? –

+0

라벨이 'N/Y'로 맞습니까? 그렇다면 항상 열의 이름을 지정할 수 있습니다. 위의 변수'x'와'y'는 해당 열의 이름으로 간주됩니다. 전송 된 $ USER_ID에서 $ USER_ID %를 (를) 보낼 수 있습니다. –

+0

루이, 내가 '칼럼의 이름을 말했어.'라고 말하면 나는 칼럼을 참고했다. 이상적인 해결책은 단순히 '보낸'파일에 하나의 새로운 열을 추가하는 것이고 '보낸'의 사용자 ID (행)가 '배달 됨'에 일치하면 Y가 해당 사용자 ID의 새 열에 입력됩니다.'보낸 사람'의 사용자 ID가 배달 된 파일에서 일치하지 않으면 그 행에 N 값이 표시됩니다. 그게 더 합리적입니까? % 함수에서 %를 사용한 후에는 TRUE/FALSE가되어 Y/N 대신 작동합니다. 따라서 솔루션이 작동하는 것처럼 보일뿐입니다.하지만 내가 생각하는대로 작동하는지 확인하고 싶습니다. –