Выбрать столбцы, сопоставив их со значением строки другого данных - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь извлечь столбцы из одного кадра данных, имя столбца которого соответствует значению, указанному в строках другого кадра данных.

Таблица 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 я хочу создать подмножество таблицы 1, выбрав столбцы, имя которых соответствует содержаниютаблица 2 (столбцы 2: 4).

Для 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 голосов
/ 04 марта 2019

Это жестко, но может помочь:

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
0 голосов
/ 04 марта 2019

Вот метод 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
...