我正在尝试从一个数据框获取列,该列的名称与另一数据框的行中给出的值匹配。
表1
Number Green Blue Black White
1 10 11 0 13
2 21 14 5 12
3 24 24 11 0
表2
X L1 L2 L3 L4
1 Black White
2 Green Black
3 Blue Green White
对于表2的每一行,我想通过选择名称与表2的内容匹配的列(表2:4)来对表1进行子集化。
对于X = 2,这将是:
Number Green Black
1 10 0
2 21 5
3 24 11
我该怎么办?
我尝试了table1[, which(names(table1) %in% (table2[1, c(2:5)]))]
答案 0 :(得分:0)
这里是一种tidyverse
方法,该方法将数据帧转换为长格式,合并并最终扩展以提供所需的输出。最后的split
方法仅创建一个列表,每个元素对应于每个X
,即
library(tidyverse)
df1 %>%
gather(var, val, -Number) %>%
left_join(df2 %>% gather(val, var, -X) %>% select(-val), by = 'var') %>%
spread(var, val) %>%
split(.$X)
给出,
$`1` Number X Black Blue Green White 1 1 1 0 NA NA 13 4 2 1 5 NA NA 12 7 3 1 11 NA NA 0 $`2` Number X Black Blue Green White 2 1 2 0 NA 10 NA 5 2 2 5 NA 21 NA 8 3 2 11 NA 24 NA $`3` Number X Black Blue Green White 3 1 3 NA 11 10 13 6 2 3 NA 14 21 12 9 3 3 NA 24 24 0
答案 1 :(得分:0)
这是硬编码的,但可能有帮助:
Columns<-apply(Table2,2,function(x) match(x,names(Table1)))
Columns<-as.data.frame(Columns)
Columns[is.na(Columns)]<-0
apply(Columns,1,function(x) Table1[,x])
这给了我们(被截断了):
[[1]]
Black White
1 0 13
2 5 12
3 11 0
[[2]]
Green Black
1 10 0
2 21 5
3 24 11