提问人:Hack-R 提问时间:7/14/2016 最后编辑:Hack-R 更新时间:7/14/2016 访问量:48
将列表转换为 vector/df,同时尽管 character(0) 元素仍保持维度
Convert a list to vector/df while maintaining dimension despite character(0) elements
问:
我有一个列表,如下所示:
> 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 个单词。
答:
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_
NA
replace
评论
character(0)
NA
NULL