R 将列表列表转换为数据帧

R 将列表列表转换为数据帧,r,R,我有一个包含许多其他列表的列表,每个列表包含不同数量的字符向量,以及不同数量的元素。我想创建一个数据框,其中每个列表将表示为一行,该列表中的每个字符向量将表示为一列。当字符向量有>1个元素时,将使用“+”符号连接和分隔元素,以便将它们存储为一个字符串。数据如下所示: fruits <- list( list(c("orange"), c("pear")), list(c("pear", "orange"

我有一个包含许多其他列表的列表,每个列表包含不同数量的字符向量,以及不同数量的元素。我想创建一个数据框,其中每个列表将表示为一行,该列表中的每个字符向量将表示为一列。当字符向量有>1个元素时,将使用“+”符号连接和分隔元素,以便将它们存储为一个字符串。数据如下所示:

fruits <- list(
  list(c("orange"), c("pear")),
  list(c("pear", "orange")),
  list(c("lemon", "apple"),
       c("pear"),
       c("grape"),
       c("apple"))
)

fruits_df <- data.frame(col1 = c("orange", "pear + orange", "lemon + apple"),
           col2 = c("pear", NA, "pear"), 
           col3 = c(NA, NA, "grape"),
           col4 = c(NA, NA, "apple"))

fruits这有点混乱,但这里有一种方法

cols <-  lapply(fruits, function(x) sapply(x, paste, collapse=" + "))
ncols <- max(lengths(cols))
dd <- do.call("rbind.data.frame", lapply(cols, function(x) {length(x) <- ncols; x}))
names(dd)  <- paste0("col", 1:ncol(dd))
dd

#            col1 col2  col3  col4
# 1        orange pear  <NA>  <NA>
# 2 pear + orange <NA>  <NA>  <NA>
# 3 lemon + apple pear grape apple

cols这有点混乱,但这里有一种方法

cols <-  lapply(fruits, function(x) sapply(x, paste, collapse=" + "))
ncols <- max(lengths(cols))
dd <- do.call("rbind.data.frame", lapply(cols, function(x) {length(x) <- ncols; x}))
names(dd)  <- paste0("col", 1:ncol(dd))
dd

#            col1 col2  col3  col4
# 1        orange pear  <NA>  <NA>
# 2 pear + orange <NA>  <NA>  <NA>
# 3 lemon + apple pear grape apple

cols对于
fruits
中的每个列表,您可以创建一行数据帧并绑定数据

dplyr::bind_rows(lapply(fruits, function(x) as.data.frame(t(sapply(x, 
                 function(y) paste0(y, collapse = "+"))))))

#           V1   V2    V3    V4
#1      orange pear  <NA>  <NA>
#2 pear+orange <NA>  <NA>  <NA>
#3 lemon+apple pear grape apple
dplyr::bind_rows(lappy(fruits),function(x)as.data.frame(t)(sappy(x,
函数(y)粘贴0(y,collapse=“+”));)
#V1 V2 V3 V4
#1个橙梨
#2个梨+桔子
#3柠檬+苹果梨葡萄苹果

对于
水果中的每个列表
可以创建一行数据框并绑定数据

dplyr::bind_rows(lapply(fruits, function(x) as.data.frame(t(sapply(x, 
                 function(y) paste0(y, collapse = "+"))))))

#           V1   V2    V3    V4
#1      orange pear  <NA>  <NA>
#2 pear+orange <NA>  <NA>  <NA>
#3 lemon+apple pear grape apple
dplyr::bind_rows(lappy(fruits),function(x)as.data.frame(t)(sappy(x,
函数(y)粘贴0(y,collapse=“+”));)
#V1 V2 V3 V4
#1个橙梨
#2个梨+桔子
#3柠檬+苹果梨葡萄苹果

另一种方法,使用
rrapply::rrapply
将列表融化为data.frame,然后使用
data.table::dcast
将其强制转换为所需格式:

库(rrapply)
库(数据表)
##熔化到长数据帧
长..1..2..3..4
#>1:橙梨
#>2:梨+橙
#>3:柠檬+苹果梨葡萄苹果

另一种方法,使用
rrapply::rrapply
将列表融化为data.frame,然后使用
data.table::dcast
将其强制转换为所需格式:

库(rrapply)
库(数据表)
##熔化到长数据帧
长..1..2..3..4
#>1:橙梨
#>2:梨+橙
#>3:柠檬+苹果梨葡萄苹果