将嵌套列表(长度不等)转换为数据框

8

我有一个嵌套的列表; 对于某些索引,一些变量是缺失的。

[[1]]
    sk   ques   pval 
  "10" "sfsf" "0.05" 

[[2]]
    sk   ques   pval   diff 
 "24" "wwww" "0.11"  "0.3" 

[[3]]
    sk   ques   pval   diff    imp 
  "24" "wwww" "0.11"  "0.3"    "2" 

我该如何将此转换为数据框,其中对于第一行,data$diff [1] = NA? 以上情况将是具有5个变量和3个观察值的数据框。
数据框中的变量数量将是列表元素中唯一名称的数量,并且列表内部的缺失值将被替换为NA。
谢谢,
编辑:数据格式
list(structure(c("10", "sfsf", "0.05"), .Names = c("sk", "ques", 
"pval")), structure(c("24", "wwww", "0.11", "0.3"), .Names = c("sk", 
"ques", "pval", "diff")), structure(c("24", "wwww", "0.11", "0.3", 
"2"), .Names = c("sk", "ques", "pval", "diff", "imp")))

每个列表元素内部是向量还是数据框?它们看起来像是命名向量。请问您能否发布 dput(head(list, 3)) 的输出结果? - Rich Scriven
RichardScriven,你发现得不错。在我看来,它们应该是合适的数据框。如果你进行转换,你仍然可以使用rbind.fill函数:rbind.fill(lapply(mydata, function(x)as.data.frame(t(x)))) - MrFlick
1个回答

23
我们通过使用sapply循环来获取list元素('indx')的长度。在最新版本的R中,我们可以使用lengths替换sapply(.., length)步骤。我们将每个元素的length更改为从'indx'(length<-)获取的max长度,并因此在长度小于max长度的list元素末尾填充NA值。我们可以将list元素rbind,转换为data.frame并更改列名。
 indx <- sapply(lst, length)
 #indx <- lengths(lst) 
 res <- as.data.frame(do.call(rbind,lapply(lst, `length<-`,
                          max(indx))))

 colnames(res) <- names(lst[[which.max(indx)]])
 res
 # sk ques pval diff  imp
 #1 10 sfsf 0.05 <NA> <NA>
 #2 24 wwww 0.11  0.3 <NA>
 #3 24 wwww 0.11  0.3    2

数据

 lst <- list(structure(c("10", "sfsf", "0.05"), .Names = c("sk", "ques", 
 "pval")), structure(c("24", "wwww", "0.11", "0.3"), .Names = c("sk", 
 "ques", "pval", "diff")), structure(c("24", "wwww", "0.11", "0.3", 
 "2"), .Names = c("sk", "ques", "pval", "diff", "imp")))

当我尝试这个解决方案时,我得到了一个错误:Error in row.names<-.data.frame(tmp, value = value) : duplicate 'row.names' are not allowed。此外还有一个警告信息:在定义res的位置上设置'row.names'时出现非唯一值:‘1’。我不确定为什么会发生这种情况。 - jessi
@jessi 如果你给 data.frame 分配了重复的行名,它将无法工作,因为 data.frame 只能接受唯一的行名,但是对于矩阵而言,重复的行名是可以的,即不需要使用 as.data.frame - akrun
@akrun,今天我测试了一下,我的结果数据框在没有调用colnames(res) <- names(lst([[which.max(indx)]])的情况下给出了列名。 - msoderstrom
根据我发布的示例,在调用最后一行代码之前,“V4”和“V5”是第4列和第5列的列名,这些名称会通过 colnames(res) <- 进行更改。 - akrun
@akrun 如果它是嵌套列表呢? [[1]] sk ques pval [[act]] "10" "sfsf" "0.05" "time" - Rudr
@Rudr 你可能需要一个嵌套的lapply。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接