Одним из вариантов будет цикл по list
('list1'), filter
столбцу 'names' на основе вектора 'names', преобразование его в один набор данных при создании столбца идентификации с .id
, spread
от 'long' до 'wide' и удалите столбец 'grp'
library(tidyverse)
map_df(list1, ~ .x %>%
filter(names %in% !! names), .id = 'grp') %>%
spread(names, values) %>%
select(-grp)
# a b c
#1 25 13 11
#2 12 10 NA
Или другой вариант - связать наборы данных вместе с bind_rows
, создал идентификатор группы«grp» для указания элемента list
, filter
строк путем выбора только столбца «names», который соответствует «names» vector
и spread
от «long» до «wide»
bind_rows(list1, .id = 'grp') %>%
filter(names %in% !! names) %>%
spread(names, values)
ПРИМЕЧАНИЕ. Лучше не использовать зарезервированные ключевые слова для указания имен объектов (names
).Кроме того, чтобы избежать путаницы, объект должен отличаться от имен столбцов объекта dataframe.
Это также может быть сделано только с base R
.Создайте идентификатор группы с Map
, rbind
элементами list
в одном наборе данных, subset
строками, сохраняя только значения из 'names' vector
и reshape
от 'long' до 'широкий '
df1 <- subset(do.call(rbind, Map(cbind, list1,
ind = seq_along(list1))), names %in% .GlobalEnv$names)
reshape(df1, idvar = 'ind', direction = 'wide', timevar = 'names')[-1]