Функция tapply () зависит от нескольких столбцов в R - PullRequest
6 голосов
/ 07 марта 2011

В 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, но это не чистое решение, особенно если мне нужно увеличить его дотри столбца в какой-то момент.Должен быть лучший подход.

Ответы [ 3 ]

10 голосов
/ 07 марта 2011

Вы можете использовать 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)

Суммируйте с помощью суммы с формулой, указывающей группировку:

aggregate(count ~ Location+sample_year, data = x, sum)
    Location sample_year count
1        A        1995     2
2        A        2000     3
3        B        2000     7
4 голосов
/ 07 марта 2011

Или с 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

EDIT:

Я использовал объект x из ответа @ mdsumner. В любом случае ... Я рекомендую придерживаться его ответа, поскольку он не зависит от внешних пакетов (функция aggregate поставляется в комплекте с R, если вы не отсоедините пакет stats ...) И, кстати, это быстрее, чем reshape решение.

2 голосов
/ 07 марта 2011

Или с plyr (используя x из @mdsummer)

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