计算清单清单中的项目

时间:2018-08-14 12:35:35

标签: r

我有一个列表(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

4 个答案:

答案 0 :(得分:6)

我们可以将lengthslapply一起使用

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