假设我有两个数据框
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)
你可以试试这个,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
答案 1 :(得分: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
而不是创建新表,因此我认为比构建df3
更有效。此外,由于它们已添加到df1
,因此行保留其原始排序。