我想基于列表的第一元件上,以建立一个数据帧。具体来说,我有
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
答案 0 :(得分:2)
一种选择是,以循环通过list
(“list1的”),filter
基于“名称”载体的“名称”栏,将其转换为一个单一的数据集而创建的标识用柱.id
,spread
从 '长' 到 '宽' 和删除 '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
,创建了一个分组ID“GRP”来指定list
元件,filter
的行通过只选择“名称”列与“名称” vector
和spread
从“长”到“宽”匹配的
bind_rows(list1, .id = 'grp') %>%
filter(names %in% !! names) %>%
spread(names, values)
注意:这是最好不要使用保留关键字用于指定对象的名称(names
)。另外,为避免混淆,该对象应与数据框对象的列名不同。
也可以仅使用base R
完成。创建具有组标识符Map
,rbind
的{{1}}元素单一数据集,list
的行通过保持仅从 '名称' 的值subset
,和vector
从 '长' 到 '宽'
reshape
答案 1 :(得分:1)
基数R和dplyr
的混合。对于每一个列表元素,我们创建1行中的数据帧。使用dplyr
的{{1}}行将它们绑定在一起,然后使用rbind_list
仅将需要的那些列作为子集。
names
无子集看起来像这样输出
library(dplyr)
rbind_list(lapply(list1, function(x)
setNames(data.frame(t(x$values)), x$names)))[names]
# a b c
# <dbl> <dbl> <dbl>
#1 25 13 11
#2 12 10 NA
答案 2 :(得分:1)
仅使用基础R
body <- do.call('rbind', lapply(list1, function(list.element){
element.vals <- list.element[['values']]
element.names <- list.element[['names']]
names(element.vals) <- element.names
return.vals <- element.vals[names]
if(all(is.na(return.vals))) NULL else return.vals
}))
df <- as.data.frame(body)
names(df) <- names
df
答案 3 :(得分:1)
以R为底
t(sapply(list1, function(x) setNames(x$values, names)[match(names, x$names)]))
# a b c
# [1,] 25 13 11
# [2,] 12 10 NA
答案 4 :(得分:0)
为了完整起见,这是使用dcast()
和rowid()
的{{3}}方法:
library(data.table)
nam <- names1 # avoid name conflict with column name
rbindlist(list1)[names1 %in% nam, dcast(.SD, rowid(names1) ~ names1)][, names1 := NULL][]
a b c 1: val1 13 11 2: 12 10 <NA>
或更简洁地说,在重塑后选择列:
library(data.table)
rbindlist(list1)[, dcast(.SD, rowid(names1) ~ names1)][, .SD, .SDcols = names1]