R 对列表列表中的项目进行计数

R 对列表列表中的项目进行计数,r,R,我有一个相同长度的列表(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] "

我有一个相同长度的列表(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"

我们可以使用
length
lappy

do.call(rbind, lapply(ll, lengths))
#     [,1] [,2] [,3]
#[1,]    3    3    0
#[2,]    2    2    0
#[3,]    1    1    1

或者使用
length
打开
simplify2array

lengths(simplify2array(ll))
#      [,1] [,2] [,3]
#[1,]    3    2    1
#[2,]    3    2    1
#[3,]    0    0    1
使用转置获得预期的输出

您可以尝试:

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))

另一种选择
rappy
统计列表中列表中的元素数。如果您对列表中的这些计数满意,那么可以使用
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" 
ll2试试这个:

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

ll或
t(sapply(ll,length))
。使用
lappy
,矩阵的元素是列表,而不是整数或双精度。我报告得到的输出与@akrun相同。R版本3.5.1(2018-07-02)我更新了我的R,它解决了我遇到的问题。解决方案2运行良好。但是文档仍然声明:“获取列表或原子向量(is.atomic)中每个元素的长度”作为整数或数字向量。我不会将矩阵称为向量…我的坏消息是没有最新版本。但我并没有恶意,akrun。@AndreElrico没问题。这可能是版本的变化。我知道rapply
会出现在这篇文章的某个地方
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