2016-06-11 2 views
0

저는 R의 초보 사용자입니다. 다음과 같은 문제가 있습니다.다른 데이터 프레임을 사용하여 데이터 프레임의 여러 열을 업데이트

2 개 이상의 데이터 프레임을 병합하려고합니다. 병합하는 동안 5 개의 변수가 있고 두 개의 데이터 프레임에 여러 개의 다른 겹치는 열이 있습니다. 한 데이터 프레임에서 이러한 중복 변수를 다른 변수로 업데이트하려고합니다. 나는이 웹 사이트를 수색하고 몇몇 응답을 찾아 냈다 그러나 그들의 아무도는 나의 경우에는 능률적 없다. 그 이유는 업데이트 할 컬럼이 여러 개 있기 때문입니다. 마지막으로 100 개의 월 데이터를 병합 할 때 중복되는 컬럼의 이름을 항상 알지 못합니다. 이전 솔루션은 일반적으로 코드의 각 열의 이름을 작성하여 업데이트하지만 이름을 사용하지 않고이를 수행하는 방법을 찾고 있습니다. 예를 들어

, 말할 수 ..

tuse1 
age d1 a1 a2 a3 a4 a5 
1 89 2 3 3 NA NA 
2 34 3 4 5 NA NA 

tuse2 
age d1 a1 a2 a3 a4 a5 a6 
1 89 2 3 3 3 6 2 
2 34 3 4 5 4 7 2 
3 32 4 3 3 6 6 6 

나는 나이와 D1에 의해 tuse1 및 tuse2 병합 싶어요. 코드의 열 이름을 사용하지 않고 tuse1 NA 변수를 tuse2로 업데이트 할 수있는 코드가 필요합니다.

는 여기에 내 코드입니다 :

key = c("age", "d1") 
comNam = intersect(names(tuse1), names(tuse2)) 
comNam = comNam[3:length(comNam)] 
merge_second_age = merge(x = tuse1, y = tuse2, all = TRUE, by = c(key)) 

for(i in comNam){ 
    left <- paste(i, ".x", sep="") 
    right <- paste(i, ".y", sep="") 

merge_second_age$i = with(merge_second_age, factor(ifelse(is.na(left), right, left))) 
merge_second_age$left = NULL; merge_second_age$right = NULL 
merge_second_age$left = NULL; merge_second_age$right = NULL 

} 

이 코드는 원하는 출력을 제공하지 않습니다 불행히도 오류없이 작동하는 것처럼 보이지만. 다음과 같이

내가보고하고 원하는 출력은 다음과 같습니다

age d1 a1 a2 a3 a4 a5 a6 
    1 89 2 3 3 3 6 2 
    2 34 3 4 5 4 7 2 

내가 어떤 도움을 주셔서 감사합니다.

최저 Dilsat는

+0

당신이 원하는 출력을 제공 할 수 있습니까? – 989

+0

예를 들어 원하는 출력을 줄 수 있습니까? 예를 들어 age = 2, d1 = 34의 경우 두 dfs간에 'a2'값이 다른 경우 어떻게됩니까? – jalapic

+0

Hello @ m0h3n, 빠른 답장을 보내 주셔서 감사합니다. 방금 질문을 편집하고 원하는 출력을 추가했습니다. 코드에서 원래의 데이터 세트처럼 변수 이름을 사용하지 않도록 노력하고 있습니다. 코드에서 이러한 중복되는 열을 찾아서 업데이트해야합니다. 백만 번 감사드립니다!:) – Dilsat

답변

0

가정하여 keyaged1, 이것은 당신이 무엇을 할 수 있는지 :

:

common=tuse2[intersect(match(tuse1$age,tuse2$age), match(tuse1$d1,tuse2$d1)),] 

이 당신의 key 길이가 더 2보다 경우에 당신이 할 수있는 일입니다

common=tuse2[Reduce(intersect, list(
match(tuse1$age,tuse2$age), 
match(tuse1$d1,tuse2$d1), 
match(tuse1$a1,tuse2$a1), 
match(tuse1$a2,tuse2$a2), 
match(tuse1$a3,tuse2$a3))) 
,] 

동일한 출력을 제공합니다 귀하의 홍보 ovided :

, tuse1aged1 조건으로 tuse2와 병합되어
age d1 a1 a2 a3 a4 a5 a6 
1 1 89 2 3 3 3 6 2 
2 2 34 3 4 5 4 7 2 

. 또한, NA의 값이 tuse1 인 경우, aged1이 동일한 경우, 각각 tuse2의 값으로 치환된다.

데이터

tuse1=structure(list(age = 1:2, d1 = c(89L, 34L), a1 = 2:3, a2 = 3:4, 
    a3 = c(3L, 5L), a4 = c(NA, NA), a5 = c(NA, NA)), .Names = c("age", 
"d1", "a1", "a2", "a3", "a4", "a5"), class = "data.frame", row.names = c(NA, 
-2L)) 

tuse2=structure(list(age = 1:3, d1 = c(89L, 34L, 32L), a1 = 2:4, a2 = c(3L, 
4L, 3L), a3 = c(3L, 5L, 3L), a4 = c(3L, 4L, 6L), a5 = c(6L, 7L, 
6L), a6 = c(2L, 2L, 6L)), .Names = c("age", "d1", "a1", "a2", 
"a3", "a4", "a5", "a6"), class = "data.frame", row.names = c(NA, 
-3L)) 
+0

@Dilsat : 내 업데이트를 참조하십시오. – 989

+0

다시 한번 고마워요. 그러나 원래 데이터 세트에는 5 가지 주요 변수가 있습니다. 교차 함수는 내가 이해하는 한 두 변수만으로 작동합니다. 이 문제를 어떻게 처리 할 수 ​​있는지 알고 있습니까? – Dilsat

+0

@Dilsat 내 업데이트 참조 – 989

관련 문제