我有以下数据框与列表列:
a <- data.frame(col1=c("a","b","c"))
a$col2 <- list(list(),list(name="Michal", age=28), list(name="Johnny", age=31))
Run Code Online (Sandbox Code Playgroud)
我想将这些列合并为一个数据框,以便所需的输出看起来像数据框下面:
col1 name age
1 a NA NA
2 b Michal 28
3 c Johny 31
Run Code Online (Sandbox Code Playgroud)
用于将列表列转换为我正在使用的数据帧
plyr::ldply(a$col2, data.frame)
or
lapply(a$col2, data.frame, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它会在第一个位置跳过空列表:
name age
1 Michal 28
2 Johny 31
Run Code Online (Sandbox Code Playgroud)
有没有任何技巧,如何保持这个空列表进一步cbind().
这是一个选项 data.table
library(data.table)
setDT(a)[, unlist(col2, recursive = FALSE), col1][a[, "col1", with = FALSE], on = .(col1)]
# col1 name age
#1: a NA NA
#2: b Michal 28
#3: c Johnny 31
Run Code Online (Sandbox Code Playgroud)
如果我们需要一个tidyverse选项
library(tidyverse)
a$col2 %>%
set_names(a$col1) %>%
Filter(length, .) %>%
bind_rows(., .id = "col1") %>%
left_join(a[1], .)
# col1 name age
#1 a <NA> NA
#2 b Michal 28
#3 c Johnny 31
Run Code Online (Sandbox Code Playgroud)