我有一个名为z
的列表:
z<-list( list(a=1, b=2), list(a=2, b=3), list(a=NULL, b=4))
我希望将其转换为data.frame,并将a
中相应的data.frame
条目指定为NULL
。
这样做,
do.call( rbind, lapply( z, data.frame, stringsAsFactors=TRUE ) )
如预期的那样,给出了这个错误:
Error in data.frame(a = NULL, b = 4, check.names = FALSE, stringsAsFactors = TRUE) :
arguments imply differing number of rows: 0, 1
有什么工作?
答案 0 :(得分:5)
这是你想要做的吗?
> data.frame(do.call(rbind, z))
a b
1 1 2
2 2 3
3 NULL 4
答案 1 :(得分:2)
as.data.frame(do.call(rbind, z))
a b
1 1 2
2 2 3
3 NULL 4
答案 2 :(得分:2)
如果您对数值的数据框而不是列表的数据框感兴趣,可以尝试下面的内容。
lz <- lapply(z, function(x) {
nonnull <- sapply(x, typeof)!="NULL"
do.call(data.frame, c(x[nonnull], stringsAsFactors=FALSE))
})
require(plyr)
df <- ldply(lz)
请注意,结果会将NULL
转换为NA
以形成有效的数据帧。
> df
a b
1 1 2
2 2 3
3 NA 4
> str(df)
'data.frame': 3 obs. of 2 variables:
$ a: num 1 2 NA
$ b: num 2 3 4