通过将列与其他数据的行值进行匹配来获取列

问题描述 投票:0回答:2

我试图从一个数据帧中获取列,其列名与另一个数据帧行中给出的值相匹配。

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

r dataframe dplyr subset
2个回答
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

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
© www.soinside.com 2019 - 2024. All rights reserved.