我有一个数据框列表。其中一列包含数据框的名称:
a <- data.frame(PIN = c(1:3), Item = c("a", "a", "a"))
b <- data.frame(PIN = c(4:6), Item = c("b", "b", "b"))
List <- list(a, b)
我想从中提取更大的数据框。我的数据框列表中第一列中的值对应于第一列或更大数据框中的值,而我的数据框列表的第二列中的名称/值对应于较大数据框中的列名称:
DF <-data.frame(PIN = c(1:10), a = c(101:110), b = c(201:210), c = c(301:310))
我想在列表中的数据框中添加列,从DF中提取数据,使用PIN作为行索引,将Item作为列索引。基本上,我最终将会:
a <- data.frame(PIN = c(1:3), Item = c("a", "a", "a"), a = c(101:103))
b <- data.frame(PIN = c(4:6), Item = c("b", "b", "b"), b = c(204:206))
List <- list(a, b)
我该怎么做?
答案 0 :(得分:0)
您可能需要重新考虑数据结构:
a
的{有效负载'列b
,c
和DF
都包含相同的数据类型,DF
可以从广角重新整形长格式。这会将列名转换为可以更容易用于查找操作的数据元素。所以,我的建议是:
library(data.table)
keys <- rbindlist(List, idcol = TRUE)
DT <- setDT(melt(DF, id.vars = "PIN", variable.name = "Item"))
DT[keys, on = .(PIN, Item)]
PIN Item value .id 1: 1 a 101 1 2: 2 a 102 1 3: 3 a 103 1 4: 4 b 204 2 5: 5 b 205 2 6: 6 b 206 2
如果您仍需要列表结果:
split(DT[keys, on = .(PIN, Item)], by = ".id")
$`1` PIN Item value .id 1: 1 a 101 1 2: 2 a 102 1 3: 3 a 103 1 $`2` PIN Item value .id 1: 4 b 204 2 2: 5 b 205 2 3: 6 b 206 2