我有两个(示例)data.frames(df1,df2)
#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 )
我希望根据c
中的值,在df1
中添加一个新列,让我们说df2
。一个示例:A
的对应值为10(请参阅df2
),因此b
的{{1}}列中的每个A应该在(新)行中写下10 df1
。对于c
中xx
的每一行都是如此,所以在这种情况下,A,B,C和D.我的代码实际上并不起作用,仅基于单个值,{{1} }:
df2
我希望很清楚我想说的是什么......哦,我有一些大数据,这只是一个尝试的例子......
答案 0 :(得分:1)
听起来你只是想做一个合并/加入。首先,让我们删除c
中的空df1
并更改列名:
df1 <- df1[, !names(df1) %in% "c"]
colnames(df2) <- c("b", "c")
只有base
R,我们可以使用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可能是一个很好的起点。