R: Lapply 多重相等

R: Lapply multiple equality

给定列表 test,我如何找到在 test[[2]] 中准确重复 3 次和在 test[[3]] 中准确重复 4 次的任何数字?在这个特定的例子中,我想要一个输出,在 [[2]] 中给出 3 和 6,在 [[3]] 中给出 10。

test <- list(c(1:10),c(1:10,3,3,6,6),c(1:10,10,10,10))

我能够为每个向量生成一个 table,test2

lapply(test,table)

但是当我试图将 table 等同于 1:3 时,我将其存储为 test 的名称,我得到每个向量的 logical(0)

names(test) <- 1:3
lapply(test,function(x) table(x)==names(x))

知道哪里出了问题吗?最简单的解决方案是什么?

要生成 table 的列表:

 tab <- lapply(test, table) 

获取列表中每个对象10出现的次数:

lapply(tab, '[', "10")

[[1]]
10 
 1 

[[2]]
10 
 2 

[[3]]
10 
 3 

我不确定您的方法是什么,但这将 return 数字出现两次:

lapply(seq_along(test), function(ii) which(tabulate(test[[ii]]) == ii))
# [[1]]
# integer(0)
# 
# [[2]]
# [1] 10
# 
# [[3]]
# integer(0)

如果您 运行 lapply(test, names) 您会看到 names 函数应用于每个列表元素只是 returns NULL。在幕后,我认为 lapply 只是将子列表的内容而不是子列表本身传递给函数(就像使用双方括号进行子集时一样 - 尝试比较 names(test[[1]])names(test[1])).

按照你原来的想法,如果你想要的是一个逻辑向量,你可以试试这个:

lapply(1:3, function(x) table(test[x]) == x)