我有两个data.frames如下:
df1 <- data.frame(A=c("lee","eeu","ees"), B=c("lee","ggu","1su"), C=c(1,1,1)
A B C
1 lee lee 1
2 eeu ggu 1
3 ees 1su 1
df2 <- data.frame (X=c("lee","1su","eeu","ggu"), Y=c("3k3","4k4","5k","2ee"), Z=c("ggg","","","ooo"), ZA=c("vvv","","",""))
X Y Z ZA
1 lee 3k3 ggg vvv
2 1su 4k4
3 eeu 5k
4 ggu 2ee ooo
我想通过将df1 $ B与df2 $ X匹配来扩展df1。当df1 $ B = df2 $ X时,我想在new_df1中添加额外的行,其中新的B =同一行中df2中的其他条目,但保持A和C相同。
new_df1预计如下:
A B C
lee 3k3 1 ### df1$B1= df2$X1= lee
lee ggg 1
lee vvv 1
eeu 2ee 1 ### df1$B2= df2$X4= ggu
eeu ooo 1
ees 4k4 1 ### df1$B3= df2$X2= lsu
我过去使用lapply的经验似乎对内存要求很高,是否可以在不使用lapply的情况下完成?
答案 0 :(得分:4)
我认为你想要的是它的一部分:
require(reshape2)
merge(df1,melt(df2, id.var="X"), by.x="B", by.y="X", all=TRUE)
B A C variable value
1 1su ees 1 Y 4k4
2 1su ees 1 Z
3 1su ees 1 ZA
4 ggu eeu 1 Y 2ee
5 ggu eeu 1 Z ooo
6 ggu eeu 1 ZA
7 lee lee 1 Y 3k3
8 lee lee 1 Z ggg
9 lee lee 1 ZA vvv
10 eeu <NA> NA Y 5k
11 eeu <NA> NA Z
12 eeu <NA> NA ZA
我将该对象分配给“M1”(后来注意到它不需要all = TRUE)
M1 <- merge(df1,melt(df2, id.var="X"), by.x="B", by.y="X")
subset(M1, value != "" , select=c(A,value, C) )
A value C
1 ees 4k4 1
4 eeu 2ee 1
5 eeu ooo 1
7 lee 3k3 1
8 lee ggg 1
9 lee vvv 1
答案 1 :(得分:3)
我会使用reshape包中的melt()来执行此任务。
melt(df2, c("X"))
X variable value
1 lee Y 3k3
2 1su Y 4k4
3 eeu Y 5k
4 ggu Y 2ee
5 lee Z ggg
6 1su Z
7 eeu Z
8 ggu Z ooo
9 lee ZA vvv
10 1su ZA
11 eeu ZA
12 ggu ZA
x <- melt(df2, c("X"))
x$variable <- NULL
x$C <- 1
colnames(x) <- c("A","B","C")
现在是子集,而rbind()
x <- subset(x, B != "")
newdf <- rbind(df1, x)
答案 2 :(得分:1)
更容易做到这一点......使用match
函数。
df1$Y <- df2$Y[match(df1$B, df2$X)]
您也可以将其扩展到其他列。
答案 3 :(得分:0)
#example data.frames
d <- data.frame(a=c(1:10), b=c(1:10))
e <- data.frame(a=c(5:1), b=c(5:1))
#add row number of reference data.frame
d$row <- c(1:nrow(d))
#merge data.frames by desired columns
m<- merge.data.frame(d,e,by=c("a","b"))
#check results
m$row
d$row %in% m$row