![](/img/trans.png)
[英]creating a new data frame by extracting columns from one data frame based on the value of column in another data frame
[英]Create a new column from different columns of one data frame conditioned on another column from another data frame
假設我有兩個數據框
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。
正如基於包含列名的變量從不同列中選擇值所建議的,我可以通過兩個步驟來實現:
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
我的問題是:我們可以一步一步做到嗎? 此外,由於我的數據相對較大,因此此原始解決方案的第一步需要大量時間。 我們可以更快地做到這一點嗎? 有什么建議么?
您可以嘗試這樣做,C列可以指示df1中的列值
setDT(df1) df1[, e := eval(parse(text = names(df1)[C])), by = 1:nrow(df1)] df1
ABC 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
這是我的處理方式:
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
,因此這些行保留其原始順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.