通过将列与另一个数据的行值匹配来获取列

时间:2019-03-04 07:07:25

标签: r dataframe dplyr subset

我正在尝试从一个数据框获取列,该列的名称与另一数据框的行中给出的值匹配。

表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)]))]

2 个答案:

答案 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