适用于列表列的 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))
我想将 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))