2017-08-29 160 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) –

相關問題