我想根据列表的第一个元素创建一个数据框。具体来说,我有
names1 <- c("a", "b", "c")
dat1 <- data.frame(names1 =c("a", "b", "c", "f"),values= c("val1", 13, 11, 0))
dat1$values <- as.factor(dat1$values)
dat2 <- data.frame(names1 =c("a", "b", "x"),values= c(12, 10, 2))
dat2$values <- as.factor(dat2$values)
list1 <- list(dat1, dat2)
结果应该是一个新的数据框,其中包含变量“名称”以及与每个列表部分匹配的所有值:
a b c
val1 13 11
12 10 NA
最佳答案
一种选择是循环遍历list
('list1'),根据'names'向量过滤
'names'列,将其转换为单个数据集,同时使用 .id
创建标识列,扩展
从“长”到“宽”并删除“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
绑定(bind)在一起,创建一个分组id“grp”来指定list
元素,filter
通过仅选择与“名称”向量
匹配的“名称”列并从“长”到“宽”扩展
来划分行
bind_rows(list1, .id = 'grp') %>%
filter(names %in% !! names) %>%
spread(names, values)
注意:最好不要使用保留关键字来指定对象名称 (names
)。另外,为了避免混淆,该对象应该与数据框对象的列名称不同。
也可以仅使用 base R
来完成。使用Map
创建组标识符,将list
元素rbind
到单个数据集,通过仅保留行子集
来来自“名称”向量
的值,以及从“长”到“宽”的 reshape
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]
关于r - 创建数据框,根据列表的第一个元素进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54494811/