R 对列表列表中的项目进行计数
我有一个相同长度的列表(l1、l2、l3)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 <- 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