将不同长度的列表转换为R中的数据帧或数据表
我有一份清单。这些清单长度不同将不同长度的列表转换为R中的数据帧或数据表,r,R,我有一份清单。这些清单长度不同 listXYZ <- list(c("x1", "x2", "x3"), c("y1", "y2", "y3", "y4", "y5", "y6"), c("z1")) 但我见过的最简单的非plyr等价物是 do.call(rbind, listXYZ) 这将通过重复较短的列表来替换空格,直到它达到最长列表的长度。较短列表中的空格应填写NA 由于列表长度不同,其他方法会产生错误消息,例如
listXYZ <- list(c("x1", "x2", "x3"),
c("y1", "y2", "y3", "y4", "y5", "y6"),
c("z1"))
但我见过的最简单的非plyr等价物是
do.call(rbind, listXYZ)
这将通过重复较短的列表来替换空格,直到它达到最长列表的长度。较短列表中的空格应填写NA
由于列表长度不同,其他方法会产生错误消息,例如:
In (function (..., deparse.level = 1) :
number of columns of result is not a multiple of vector length (arg 1)
有没有一种方法可以很好地扩展(对于较大的列表)?在我的例子中,列表总是有5行,但列表的长度变化很大。索引超过向量末尾会导致
NA
,因此您可以使用它来填充NAs:
max_len <- max(sapply(listXYZ,length))
do.call("rbind",lapply(listXYZ,function(x) x[seq(max_len)]))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "x1" "x2" "x3" NA NA NA
[2,] "y1" "y2" "y3" "y4" "y5" "y6"
[3,] "z1" NA NA NA NA NA
max_len您遇到的问题可以通过更新length属性来解决
len <- max(lengths(listXYZ))
t(sapply(listXYZ, `length<-`, len))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "x1" "x2" "x3" NA NA NA
[2,] "y1" "y2" "y3" "y4" "y5" "y6"
[3,] "z1" NA NA NA NA NA
len
len <- max(lengths(listXYZ))
t(sapply(listXYZ, `length<-`, len))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "x1" "x2" "x3" NA NA NA
[2,] "y1" "y2" "y3" "y4" "y5" "y6"
[3,] "z1" NA NA NA NA NA