R:根据第二个data.frame中的值在d​​ata.frame中创建一个新列

时间:2014-04-29 15:31:43

标签: r dataframe

我有两个(示例)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。对于cxx的每一行都是如此,所以在这种情况下,A,B,C和D.我的代码实际上并不起作用,仅基于单个值,{{1} }:

df2

我希望很清楚我想说的是什么......哦,我有一些大数据,这只是一个尝试的例子......

1 个答案:

答案 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.tablesqldf。我没有使用这两个,所以我不能对他们说多少,​​但这里有一个comparison of their speed可能是一个很好的起点。