【问题标题】:apply to data.frame with list column适用于带有列表列的 data.frame
【发布时间】:2016-09-13 18:15:29
【问题描述】:

我想将 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"]))

【问题讨论】:

    标签: r apply


    【解决方案1】:

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

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

    如果我们只对元素的数量感兴趣,请使用summapply 它返回vector

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

    注意:Map 只是 mapply 的包装器,它总是返回 list 输出。

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

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

    【讨论】:

    • 谢谢!我如何将“na.rm=TRUE”传递给这些函数?
    • @vanaoveneri 您可以使用summarise(n = sum(dv &lt; edge, na.rm=TRUE)),在第一种情况下使用sum(x &lt; y, na.rm = TRUE)
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2020-09-19
    • 2015-01-18
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2019-08-12
    • 2013-09-26
    相关资源
    最近更新 更多