开发者

tapply() function dependent on multiple columns in R

开发者 https://www.devze.com 2023-02-15 09:09 出处:网络
In R, I have a table with Location, sample_year and count. So, Location sample_year count A19951 A19951 A20003

In R, I have a table with Location, sample_year and count. So,

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

I want a summary table that examines both the 'Location' and 'sample_year' columns and sums 'count' dependent on this unique combination instead of just a single column. So, end result should be:

Location sample_year sum_count开发者_运维百科
A        1995        2
A        2000        3
B        2000        7

I could merge columns and data into a new column to create unique a Location-sample_year but this is not a clean solution, esp if I need to scale it up to three columns at some point. There must be a better approach.


You can use aggregate with a formula.

First the data:

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)

Aggregate using sum with a formula specifying the grouping:

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


Or with reshape package:

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

EDIT:

I used object x from @mdsumner's answer. Anyway... I recommend you to stick with his answer, since it doesn't depend on external packages (aggregate function comes bundled with R, unless you detach stats package...). And, BTW, it's faster than reshape solution.


Or with plyr (using x from @mdsummer)

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号