我有一个列表(ll)的列表(l1,l2,l3)具有相同的长度。
l1 <- list( c("a","b","c") , c("d","e","f") , c(NULL) )
l2 <- list( c("a","b") , c("d","e") , c(NULL) )
l3 <- list( c("a") , c("d") , c("g") )
ll <- list(l1,l2,l3)
str(ll)
List of 3
$ :List of 3
..$ : chr [1:3] "a" "b" "c"
..$ : chr [1:3] "d" "e" "f"
..$ : NULL
$ :List of 3
..$ : chr [1:2] "a" "b"
..$ : chr [1:2] "d" "e"
..$ : NULL
$ :List of 3
..$ : chr "a"
..$ : chr "d"
..$ : chr "g"
有没有一种方法可以创建一个(摘要?)表来计算/比较每个列表中有多少项,而使用for / loop来进行计算呢?
我正在考虑这样的输出:
list 1 2 3
l1 3 3 0
l2 2 2 0
l3 1 1 1
答案 0 :(得分:6)
我们可以将lengths
与lapply
一起使用
do.call(rbind, lapply(ll, lengths))
# [,1] [,2] [,3]
#[1,] 3 3 0
#[2,] 2 2 0
#[3,] 1 1 1
或在lengths
上使用simplify2array
lengths(simplify2array(ll))
# [,1] [,2] [,3]
#[1,] 3 2 1
#[2,] 3 2 1
#[3,] 0 0 1
进行移调可获得预期的输出
答案 1 :(得分:5)
您可以尝试:
t(sapply(ll, function(x) lapply(x,length)))
# [,1] [,2] [,3]
#[1,] 3 3 0
#[2,] 2 2 0
#[3,] 1 1 1
编辑:
@Ryan在评论中指出,以下内容对其进行了简化:
t(sapply(ll, lengths))
答案 2 :(得分:2)
另一个选项。 rapply
计算列表中列表中元素的数量。如果可以将这些计数列入列表,则可以将ll2
作为最终结果。 stri_list2matrix
函数可用于将数据转换为矩阵。我们指定空列表的值为零。
ll2 <- rapply(ll, length, how="list")
ll2
[[1]]
[[1]][[1]]
[1] 3
[[1]][[2]]
[1] 3
[[1]][[3]]
list()
[[2]]
[[2]][[1]]
[1] 2
[[2]][[2]]
[1] 2
[[2]][[3]]
list()
[[3]]
[[3]][[1]]
[1] 1
[[3]][[2]]
[1] 1
[[3]][[3]]
[1] 1
library(stringi)
stri_list2matrix(lapply(ll2, unlist), byrow=TRUE, fill=0)
[,1] [,2] [,3]
[1,] "3" "3" "0"
[2,] "2" "2" "0"
[3,] "1" "1" "1"
答案 3 :(得分:1)
尝试一下:
ll <- list(l1 = l1,l2 = l2,l3 = l3)
as.data.frame(sapply(ll, function(x){sapply(x, length)}, USE.NAMES = T))
# l1 l2 l3
# 1 3 2 1
# 2 3 2 1
# 3 0 0 1