R :

2014-04-29 6 views
0

난 난이 두 (예) data.frames (DF1, DF2)R :

#df1 
L <- LETTERS[1:4] 
b <- sample(L, 20, replace = TRUE) 
df1 <- data.frame(stuff1 = 1, stuff2 = 1:10, b = b, c= NA, stringsAsFactors=FALSE) 

#df2 
a <- c(10,20,30,40) 
df2 <- data.frame(xx = L, yy = a, stringsAsFactors=FALSE) 

싶지 않은 제 data.frame 아웃 값에 기초 data.frame 새로운 컬럼을 생성 새로운 열, df1df2의 값을 기준으로 c을 가정 해 봅니다. 예 : A은 해당 값이 10 (df2 참조)이므로 bdf1에있는 모든 A는 (새) 행 c에 10을 써야합니다. 그리고이 df2에서 xx의 모든 행에 대해, 그래서 A, B, C 및 D 내 코드가 정말 작동하지 않으며, 여기 A 하나의 값만을 기준으로이 경우 :

##copy column b now it is c 
df1["c"] <- df1$b 


# which value has A in df2? 
zz <- df2[df2$xx == "A",] 
xy <- zz$yy 


# fill in the new value in c (this is not working) 
df1[df1$c == "A", ] <- xy 

나는 그것을 희망 내가하고 싶은 말을 분명히하고 있습니다. 오, 그리고 나는 큰 데이터를 가지고 있습니다. 이것은 단지 시험해보기위한 예일뿐입니다. ...

답변

1

병합/결합을 원하는 것처럼 들립니다. 먼저, df1에 빈 c을 삭제하고 열 이름을 약간 변경할 수 있습니다 : 단지 base R로

df1 <- df1[, !names(df1) %in% "c"] 
colnames(df2) <- c("b", "c") 

을, 우리는 merge를 사용할 수 있습니다

df3 <- merge(df1, df2, by="b", type="left") 
head(df3) 

    b stuff1 stuff2 c 
1 A  1  1 10 
2 A  1  2 10 
3 A  1  3 10 
4 A  1  3 10 
5 A  1  10 10 
6 A  1  7 10 

수 있습니다 대안을 가지고 plyr 패키지를 더 빨리 열 순서를 유지합니다.

library(plyr) 
df4 <- join(df1, df2, by="b", type="left") 
head(df4) 

    stuff1 stuff2 b c 
1  1  1 A 10 
2  1  2 A 10 
3  1  3 A 10 
4  1  4 B 20 
5  1  5 B 20 
6  1  6 B 20 

귀하의 데이터 크기에 따라 다르지만 그렇지 않은 경우 data.table 또는 sqldf을 시도해보십시오. 나는이 두 가지를 사용하지 않았으므로 그들에게 많이 말할 수는 없지만, 좋은 출발점이 될 수있는 것은 comparison of their speed입니다.

+0

안녕하세요. 감사합니다. 그것은 내 데이터로 잘 작동하고, 나는'join'을 사용하고 있으며, 충분히 빠릅니다. 코드의 첫 번째 행에 대해 조금이라도 말씀해 주시겠습니까? – MOMO

+0

'c' 컬럼을 버리면됩니다 :'% in %'는 비교를 설정합니다. % 1에서'c (1, 2, 3) % '을 시도하십시오. 기타 http://stackoverflow.com/questions/4605206/drop-columns-r-data-frame – andybega