Применить функцию к столбцу со значением из другой строки - PullRequest
0 голосов
/ 06 марта 2012

У меня есть следующая проблема в R:

Предположим, что следующий кадр данных:

    a    b    c    d    e
1   1    1    1    1    15.5
2   1    1    1    2    8.3
3   1    1    2    1    12.4
4   1    1    2    2    3.2
...

Я хочу применить функцию f(x,y) к числам из столбца e, где x и y взяты из двух строк, которые имеют одинаковые значения во всех столбцах, кроме d (и, конечно, e). ).

Выходными данными должен быть новый фрейм данных, в котором столбец d отбрасывается (так как «слияние» делает этот столбец неактуальным), а столбец e является результатом примененной функции.

Таким образом, в примере выше, предполагая, что f(x,y) является сложением, новый фрейм данных должен выглядеть следующим образом:

    a    b    c     e
1   1    1    1     23.8
3   1    1    2     15.6
...

То, что я пробовал до сих пор, выглядит примерно так, что выглядит очень не элегантно:

data.d1 <- subset(data, d==1)
for (index in 1:nrow(data.d1))
  row1 <- data.d1[index,]
  row2 <- data[data$a==row1$a & data$b==row1$b & data$c==row1$c & data$d==2,]
  data[index,"e"] <- f(row1$e, row2$e)
}
data <- data[-match(c("d"), names(data))]

Есть ли у кого-нибудь более чистое решение, использующее apply() и т.п.? Заранее спасибо!

1 Ответ

4 голосов
/ 06 марта 2012

вот примеры:

d> ddply(x, .(a, b, c), summarize, e = sum(e))
  a b c    e
1 1 1 1 23.8
2 1 1 2 15.6
d> aggregate(e~a+b+c, sum, data = x)
  a b c    e
1 1 1 1 23.8
2 1 1 2 15.6

ddply - это функция в пакете plyr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...