Функция "diff" над различными группами в R - PullRequest
1 голос
/ 24 ноября 2011

у меня есть фрейм данных с 2 группами, 1 переменная времени и зависимая переменная. e.g.:

name <- c("a", "a", "a", "a", "a", "a","a", "a", "a", "b", "b", "b","b", "b", "b","b", "b", "b")
class <- c("c1", "c1", "c1", "c2", "c2", "c2", "c3", "c3", "c3","c1", "c1", "c1", "c2", "c2", "c2", "c3", "c3", "c3")
year <- c("2010", "2009", "2008", "2010", "2009", "2008", "2010", "2009", "2008", "2010", "2009", "2008", "2010", "2009", "2008", "2010", "2009", "2008")
value <- c(100, 33, 80, 90, 80, 100, 100, 90, 80, 90, 80, 100, 100, 90, 80, 99, 80, 100)

df <- data.frame(name, class, year, value)
df

и хотел бы применить функцию "diff" для каждой комбинации из "class" и "name".

Мой желаемый результат должен выглядеть примерно так:

      name class year value.1
    1    a    c1   2010  -67      
    2    a    c1   2009   47
    3    b    c1   2010  -10
    4    b    c1   2009   20
    ...

Я пытался

aggregate(value~name + class, data=df, FUN="diff")

, который не дает решения, которое я ищу в большом наборе данных. Заранее большое спасибо!

Sebatian

1 Ответ

5 голосов
/ 24 ноября 2011

Пакет plyr станет вашим другом. Функция ddply принимает data.frame, применяет функцию для каждого определенного подмножества, затем возвращает data.frame всех рекомбинированных частей.

Самое простое решение - использовать summarize и diff(value) для каждой комбинации .(class, name):

library(plyr)
ddply(df, .(class, name), summarize, diff(value))

   class name ..1
1     c1    a -67
2     c1    a  47
3     c1    b -10
4     c1    b  20
5     c2    a -10
6     c2    a  20
7     c2    b -10
8     c2    b -10
9     c3    a -10
10    c3    a -10
11    c3    b -19
12    c3    b  20

Чтобы получить годы по результатам, нужно немного больше задействовать:

ddply(df, .(class, name), summarize, year=head(year, -1), value=diff(value))
   class name year value
1     c1    a 2010   -67
2     c1    a 2009    47
3     c1    b 2010   -10
4     c1    b 2009    20
5     c2    a 2010   -10
6     c2    a 2009    20
7     c2    b 2010   -10
8     c2    b 2009   -10
9     c3    a 2010   -10
10    c3    a 2009   -10
11    c3    b 2010   -19
12    c3    b 2009    20
...