我有一个包含1000个列表对象的列表。在任何一个中,我都有20个列表元素var0001:var0020(每个元素的长度不一定与其他元素相同,我的意思是mylist [[]] $ var0001的长度为1,但mylist [[]] $ var0012的长度= 1000)。
例如,当列表元素的列表元素var0002 = 1时,我需要一个函数让我计算列表中列表对象的数量。
我尝试的方法如下:
sum(mylist[[]]$var0002 == 1)
辛勤工作。
我可以用非常奇怪的代码得到它,
j <- 1
for(i in 1:length(mylist)){
if(mylist[[i]]$var0002 %in% 1){
dum[[j]] <- mylist[[i]]
j <- j + 1
}
}
所以我想改进它,也许不用循环...我很确定有大约1或2行的方法。
答案 0 :(得分:1)
这是purrr
的答案。
library(purrr)
## dummy data
myList <- list(list(var1 = 1, var2 = 1), list(var1 = 0, var2 = 2), list(var1 = 1, var2 = 1))
myList %>%
purrr::map(~ .[["var2"]] == 1) %>%
unlist() %>%
sum()
答案 1 :(得分:0)
取消列表功能会将列表中的所有对象放入向量中。然后,您可以使用循环或重叠应用来计算值在内部列表中出现的时间。
sapply(1:length(mylist), function(a) sum(unlist(mylist[[a]])==1))
这应该返回一个长度为1000的向量,该向量告诉您有多少var0001-var0020的值为1。
答案 2 :(得分:0)
仅举一个最小的可复制示例。 tidyverse风格,
mylist <-
list(
list01= list(
var01 = 1:3
,var02 = 1:5
,var03 = 1:7
)
,list02= list(
var01 = 1:9
,var02 = 1:11
,var03 = 1:13
)
)
str(mylist)
#> List of 2
#> $ list01:List of 3
#> ..$ var01: int [1:3] 1 2 3
#> ..$ var02: int [1:5] 1 2 3 4 5
#> ..$ var03: int [1:7] 1 2 3 4 5 6 7
#> $ list02:List of 3
#> ..$ var01: int [1:9] 1 2 3 4 5 6 7 8 9
#> ..$ var02: int [1:11] 1 2 3 4 5 6 7 8 9 10 ...
#> ..$ var03: int [1:13] 1 2 3 4 5 6 7 8 9 10 ...
library(purrr)
mylist %>%
transpose() %>%
.$var02 %>%
unlist %>%
table()
#> .
#> 1 2 3 4 5 6 7 8 9 10 11
#> 2 2 2 2 2 1 1 1 1 1 1
由reprex package(v0.2.1)于2018-11-09创建