将列表转换为 vector/df,同时尽管 character(0) 元素仍保持维度

Convert a list to vector/df while maintaining dimension despite character(0) elements

提问人:Hack-R 提问时间:7/14/2016 最后编辑:Hack-R 更新时间:7/14/2016 访问量:48

问:

我有一个列表,如下所示:

> dput(res[1:10])
list(character(0), c("Luzhuang", "Laisu", "Peihui"), character(0), 
    c("Anjiangping", "Xinzhai", "Yongfeng"), character(0), character(0), 
    c("Puji", "Gaotun", "Banjingcun"), character(0), character(0), 
    character(0))

在此示例中,列表的长度为 10。我想取回一个同样有 10 个元素长的向量或 data.frame。

我尝试过的大多数方法都省略了有其他问题或有其他问题的元素。我最近的尝试是:character(0)

library(plyr)
geo <- rbind.fill(lapply(res, function(f) {
  as.data.frame(Filter(Negate(is.null), f))
}))

我的预期输出是:

character(0)
Luzhuang Laisu Peihui
character(0) 
Anjiangping Xinzhai Yongfeng
character(0)
character(0)
Puji Gaotun Banjingcun
character(0)
character(0) 
character(0)

或类似的东西。我不在乎空白行是否说或根本没有。原因是该列表是基于具有相同长度的数据帧创建的(我的意思是 data.frame 的 nrows = 列表的长度),现在我想将列表中的值添加回 data.frame。character(0)NA

如果更容易,您可以做一个示例,每个非空元素有 1 个单词。

r

评论

0赞 r2evans 7/14/2016
你的预期产出是多少?您只有 9 个非空元素。
0赞 Hack-R 7/14/2016
@r2evans我添加了我的预期输出,谢谢。10 是元素的总数(不仅仅是非空的)。我希望输出的长度与输入列表的长度相同,并且基本上看起来与它完全一样。
0赞 r2evans 7/14/2016
我不认为您可以将其作为 vector 或 data.frame 的元素。你能接受吗?(我从未在 data.frame 中看到过。character(0)NANULL
0赞 Hack-R 7/14/2016
@r2evans 是的,当然,没关系。我只需要它能够适应与列表长度相同(就行数而言)的数据框。

答:

2赞 r2evans 7/14/2016 #1

这就足够了吗?

res <- list(character(0), c("Luzhuang", "Laisu", "Peihui"), character(0), 
    c("Anjiangping", "Xinzhai", "Yongfeng"), character(0), character(0), 
    c("Puji", "Gaotun", "Banjingcun"), character(0), character(0), 
    character(0))
res <- sapply(res, function(s) if (length(s) == 0) NA_character_ else paste(s, collapse = " "))
res
#  [1] NA                             "Luzhuang Laisu Peihui"       
#  [3] NA                             "Anjiangping Xinzhai Yongfeng"
#  [5] NA                             NA                            
#  [7] "Puji Gaotun Banjingcun"       NA                            
#  [9] NA                             NA                            

从这里开始,将它放在 data.frame 中是直接的。

评论

0赞 Hack-R 7/14/2016
太美了。我以前从未见过。NA_character_
0赞 r2evans 7/14/2016
我实际上只是在想,一定有一种更优雅的方法,但谢谢:-)
0赞 thelatemail 7/14/2016
把它压扁——sapply(replace(res, lengths(res)==0, NA), paste, collapse=" ")
0赞 r2evans 7/14/2016
更冗长的唯一原因是我倾向于尝试类型意图。还有其他形式,它们都相对兼容,所以如果这是 codegolf,我当然会删除它。@thelatemail很好,我不知道我的工具包里有什么,谢谢!NA_character_NAreplace