【问题标题】:How to apply function over columns of matrix by multiple factors in R?如何通过R中的多个因素对矩阵列应用函数?
【发布时间】:2013-08-20 23:05:21
【问题描述】:

这是一个简单的问题,我相信它可以通过 tapply、apply 或 by 等轻松解决。但是,我对此还比较陌生,我想请教一下。

问题:

我有一个包含 5 列的数据框。例如,第 4 列和第 5 列是因子。对于第 5 列中的每个因素,我想在第 5 列中的每个组的 1:3 列上执行一个函数。原则上,这很容易实现。但是,我希望将输出作为一个漂亮的表格,并且我想学习如何以一种优雅的方式做到这一点,这就是我想在这里问你的原因。

例子:

 df <- data.frame(x1=1:6, x2=12:17, x3=3:8, y=1:2, f=1:3)

现在,命令

 by(df[,1:3], df$y, sum)

会根据y 中的每个因素水平给我总和,这几乎是我想要的。需要两个额外的步骤:一个是为f 中的每个因子级别执行此操作。这几乎是微不足道的。我可以轻松地将lapply 包裹在上面的命令周围,我会得到我想要的,除了这个:我想生成一个带有结果的表格,甚至可以用它来生成一个热图。

因此:是否有一种简单且更优雅的方法来执行此操作并生成具有相应输出的矩阵?这似乎是数据科学家的日常任务,这就是为什么我怀疑存在一个现有的内置解决方案......

感谢任何帮助或任何提示,无论多么小!

【问题讨论】:

    标签: r aggregate apply factors tapply


    【解决方案1】:

    您可以使用reshape2plyr 包来完成此操作。

    library(plyr)
    df2 <- ddply(df, .(y, f), sum)
    

    然后将其变成 f by y 矩阵:

    library(reshape2)
    acast(df2, f ~ y, value.var = "V1")
    

    【讨论】:

    • 你真的想把 yf 的值也加起来吗?
    • 感谢您的解决方案!我还没有完全理解它,因为我以前从未与plyr 合作过,但至少看起来很有希望。
    • @thelatemail 将f 视为城市,将y 视为年份。对于每一年,我想在每个城市都有x_i 的总和。将x1 视为车祸数量,将x2 视为自行车事故等。这意味着因素本身没有意义,我只想要每个城市每种类型的事故数量。我可能应该在我的问题中指定这一点,以使问题更容易理解。对此感到抱歉。
    • @user2378649 - 在这种情况下,aggregate 应该这样做:aggregate(. ~ y + f, data=df, sum)aggregate(cbind(x1,x2,x3) ~ y + f, data=df, sum) 明确指定 xN 列。
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2013-02-21
    • 2013-09-10
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多