2016-08-16 4 views
0

저는 R 초보자이고 ID 열을 기반으로 두 개의 데이터 세트를 병합하고 싶습니다. 데이터 세트 2의 ID 번호가 데이터 세트 1에 있으면 데이터 세트 2의이 특정 행에 대한 데이터를 데이터 세트 1의 행에 추가하려고합니다.조건에 따라 r에 데이터 병합 및 새 열 만들기

두 번째로 일치하는 것이 있으면 해당 특정 행/일치에 대한 일치라는 새 열의 "1"및 일치하지 않는 경우의 "0"입니다.

예 : 추가 된 열이

Dataset 1: 

Id  category 
123 3 
124 1 
125 2 

Dataset 2: 

Id  score category 
123 0.24 3 
124 0.83 1 
126 0.92 2 

최종 예 :이 지금까지 시도했습니다

Id  score category match 
123 0.24 3   1 
124 0.83 1   1 
125 NA  1   0 
126 0.92 2   1 

(일부 다른 조합), 그러나 그것은 나에게 좋은 결과를주지 않았다 :

data <- merge(df1, df2, by ="ID" , all.x = TRUE) 

정말 도움이됩니다.

재현 코드 :

df1 <- data.frame(ID=c("123","124","125"), category=c(3,1,2) 
df2 <- data.frame(ID=c("123","124","126"), score=("0.24","0.83","0.92"), category=c("3","1","2") 
+0

를 호출하여 출력을 업데이트 당신은'character' NA가 있습니까? 따옴표로 묶어서는 안됩니다. 입력 데이터가 나타나고 재현 가능한 예제의 'df2'가 일치하지 않습니다. 바이너리 컬럼을 생성하기 위해서는'% in %'를'as.integer'와 함께 사용하십시오. – akrun

+0

예상되는 출력과 재현 가능한 코드가 같은 예제 데이터는 동일하지 않습니다. ID가 '126'이 아니십니까? – user5249203

+1

[데이터 프레임 (내부, 외부, 왼쪽, 오른쪽) 조인 (병합) 방법] 중 가능한 복제본]] (http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner) -outer-left-right) –

답변

0

당신은 거의있다. 나는 당신의 모범을 약간 수정했다.

df1 <- data.frame(ID = c(123, 124, 125), 
        category=c(3, 1, 2)) 
df1 

df2 <- data.frame(ID = c(123, 124, NA), 
        score = c(0.24, 0.83, 0.35), 
        category = c(3, 1, 2)) 
df2 

df2$match <- 1 
df2 

data <- merge(df1, df2, by = c("ID", "category") , all.x = TRUE) 
data$match[is.na(data$match)] <- 0 
data 
+0

이것은 작동하지 않습니다. 'all = TRUE'이어야하고 OP – Sotos

+1

에 따라'match' 변수를 만들어야합니다. 대단히 감사합니다! 그것은 나를 위해 일하는 것 같았다. – Veraaa

0

제공 한 데이터에 대해 적절한 결과를 제공 할 수 있으면 필요한 경우 업데이트 할 수 있습니다. 그러나 다음 단계에 따라 df1에서 df1과 일치하는 df2의 기반 ID를 플래그 할 수 있습니다.

업데이트 : y 값만 표시하고 x 값은 표시하지 않는 것처럼 보입니다. 출력 all.x =T

data <- merge(df1, df2, by = c('ID', 'category') , all.x = T) 
data$match <- ifelse(data$ID %in% df2$ID, 1, 0) 

ID category score match 
1 123  3 0.24  1 
2 124  1 0.83  1 
3 125  2 <NA>  0 

데이터

df1 <- data.frame(ID=c("123","124","125"), category=c(3,1,2)) 
df2 <- data.frame(ID=c("123","124","126"), score= c("0.24","0.83","0.92"), 
       category=c(3,1,2)) 
+0

'by = c ('ID', 'category') ' – Sotos

+0

@Sotos에 감사드립니다. – user5249203

관련 문제