适用于列表列的 data.frame

apply to data.frame with list column

我想将 apply 与在一列中包含列表的 data.frame 一起使用。也就是说,一列包含向量,我想对这些向量执行各种操作。例如,我想找出具有特定值的元素有多少。

我这里有什么错误?

#reproducible code
set.seed(1)
some_list <- replicate(40, sample(c(1:8), size=sample(3:6, 1), replace=TRUE))
exdf <- expand.grid(id=c(1:10), content=c(1:4))
exdf$dv <- some_list
exdf$edge <- replicate(40, sample(3:5, size=1))

#Prolem: get elements with lesser value than "edge" in "dv"
result <- sapply(dv~., data=exdf, function(x) which(x[, "dv"] < x[, "edge"]))

我们可以使用Map来比较列中对应的元素

Map(function(x,y) which(x <y), exdf$dv, exdf$edge)

如果我们只对元素的数量感兴趣,请使用 sum 并使用 mapply 它 returns a vector

mapply(function(x,y) sum(x <y), exdf$dv, exdf$edge)

注意:Map 只是 mapply 的包装器,它总是 returns 一个 list 输出。

或者另一种选择是 unnest(来自 tidyr)和 dplyr 函数

library(dplyr)
library(tidyr)
unnest(exdf, .id = "grp") %>%
        group_by(grp) %>%
        summarise(n = sum(dv < edge))