tapply() 函数依赖于 R 中的多个列

Posted

技术标签:

【中文标题】tapply() 函数依赖于 R 中的多个列【英文标题】:tapply() function dependent on multiple columns in R 【发布时间】:2011-07-10 02:48:04 【问题描述】:

R 中,我有一张包含 Location、sample_year 和 count 的表格。所以,

Location sample_year count  
A        1995        1
A        1995        1  
A        2000        3  
B        2000        1  
B        2000        1  
B        2000        5

我想要一个汇总表,它检查“Location”和“sample_year”列,并根据这个独特的组合而不是单个列对“count”求和。所以,最终结果应该是:

Location sample_year sum_count
A        1995        2
A        2000        3
B        2000        7

我可以将列和数据合并到一个新列中以创建唯一的 Location-sample_year 但这不是一个干净的解决方案,尤其是如果我需要在某个时候将其扩展到三列。必须有更好的方法。

【问题讨论】:

这不是一个真正的 tapply() 问题,也许编辑标题更笼统?你可以用tapply得到总和,但仍然需要清理聚合列:tapply(x$count, paste(x$Location, x$sample_year), sum) 【参考方案1】:

您可以将aggregate 与公式一起使用。

首先是数据:

x <- read.table(textConnection("Location sample_year count  
A        1995        1
A        1995        1  
A        2000        3  
B        2000        1  
B        2000        1  
B        2000        5"), header = TRUE)

使用 sum 和指定分组的公式进行聚合:

aggregate(count ~ Location+sample_year, data = x, sum)
    Location sample_year count
1        A        1995     2
2        A        2000     3
3        B        2000     7

【讨论】:

+1 整洁的单行...使用基本 R 发行版中可用的函数总是更好。 我不会说“总是”,有一些更容易使用的工具,比如 reshape(和 plyr、stringr、raster,...),可以让你以更智能的方式做更多事情,我只是还没有努力学习,我只是用旧的东西来学习,因为我就是这样学习的。如果我知道我也会推荐的新东西,我会对你的答案投票! 恕我直言,reshape 仅在复杂聚合的情况下才有效。 plyr 是另一个很酷的包,非常值得学习。【参考方案2】:

或使用reshape 包:

library(reshape)
md <- melt(x, measure.vars = "count")
cast(md, Location + sample_year ~ variable, sum)
  Location sample_year count
1        A        1995     2
2        A        2000     3
3        B        2000     7

编辑:

我使用了@mdsumner 回答中的对象x。无论如何......我建议你坚持他的回答,因为它不依赖于外部包(aggregate 函数与 R 捆绑在一起,除非你分离 stats 包......)。而且,顺便说一句,它比reshape 解决方案更快。

【讨论】:

【参考方案3】:

或使用plyr(使用来自@mdsummer 的x

library(plyr)
ddply(x, .(Location,sample_year), summarise, count = sum(count))

【讨论】:

以上是关于tapply() 函数依赖于 R 中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

解释 R tapply 描述

R中的高效批量处理函数(lapply sapply apply tapply mapply)(转)

R中的高效批量处理函数(lapply sapply apply tapply mapply)(转)

R函数之:apply(), lapply(), sapply(), tapply()

R apply() 函数和 tapply() 函数

R语言apply函数详解及实战(lapply, sapply, vapply, tapply,mapply)