2017-08-29 191 views
2

假设我有两个数据帧创建从另一个数据帧条件上的另一列一个数据帧的不同列的新列

df1 <- data.frame(A = 1:6, B = 7:12, C = rep(1:2, 3)) 
df2 <- data.frame(C = 1:2, D = c("A", "B")) 

我想创建DF1,其值的新E列是基于列C的值,然后可以在df2中连接到列D.例如,df1的第一行中的C值是“1”。并且df2中的列C的值1对应于列D的“A”,因此在df2中创建的值E应该来自列“A”,即1.

Select values from different columns based on a variable containing column names所建议的,我可以通过两步骤:

setDT(df1) 
setDT(df2) 
df3 <- df1[df2, on = "C"] # step 1 combines the two data.tables 
df3[, E := .SD[[.BY[[1]]]], by = D] # step 2 

我的问题是:我们可以在一个步骤中做到这一点?此外,由于我的数据相对较大,这个原始解决方案的第一步需要很长时间。我们能以更快的速度做到这一点吗? 有什么建议吗?

+0

如果它被标记为复制,则意味着答案是另一个问题;) –

+0

遗憾的混乱,更新的问题是现在从原来的一个 –

+0

多少行的实际数据DF2已经不同? – zx8754

回答

0

这是我会怎么做:

df1[df2, on=.(C), D := i.D][, E := .SD[[.BY$D]], by=D] 

    A B C D E 
1: 1 7 1 A 1 
2: 2 8 2 B 8 
3: 3 9 1 A 3 
4: 4 10 2 B 10 
5: 5 11 1 A 5 
6: 6 12 2 B 12 

这增加列到df1作为参考,而不是制作一个新表,所以我想比建立更有效率。另外,由于它们被添加到df1,这些行保持其原始排序。

0

你可以试试这个,可以的C柱表示从DF1

setDT(df1) df1[, e := eval(parse(text = names(df1)[C])), by = 1:nrow(df1)] df1列值

A B C e 1: 1 7 1 1 2: 2 8 2 8 3: 3 9 1 3 4: 4 10 2 10 5: 5 11 1 5 6: 6 12 2 12

+0

请不要忘记添加一些文字说明您的答案 - 为什么它的作品以及它如何解决原来的问题。 –

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17176813) –

相关问题