Как использовать ddply для добавления столбца во фрейм данных? - PullRequest
11 голосов
/ 27 сентября 2011

У меня есть фрейм данных, который выглядит следующим образом:

site   date  var   dil
   1    A    7.4   2 
   2    A    6.5   2
   1    A    7.3   3
   2    A    7.3   3
   1    B    7.1   1
   2    B    7.7   2
   1    B    7.7   3
   2    B    7.4   3

Мне нужно добавить столбец с именем wt к этому фрейму данных, который содержит весовой коэффициент, необходимый для вычисления взвешенного среднего.Этот весовой коэффициент должен быть получен для каждой комбинации site и date.

. Подход, который я использую, заключается в том, чтобы сначала построить функцию, которая вычисляет весовой коэффициент:

> weight <- function(dil){
                    dil/sum(dil)
                     }

, затем примените функцию для каждой комбинации site и date

> df$wt <- ddply(df,.(date,site),.fun=weight)

, но я получаю это сообщение об ошибке:

Error in FUN(X[[1L]], ...) : 
  only defined on a data frame with all numeric variables

1 Ответ

16 голосов
/ 28 сентября 2011

Вы почти у цели.Измените свой код, чтобы использовать функцию transform.Это позволяет добавлять столбцы к data.frame внутри ddply:

weight <- function(x) x/sum(x)

ddply(df, .(date,site), transform, weight=weight(dil))

  site date var dil weight
1    1    A 7.4   2   0.40
2    1    A 7.3   3   0.60
3    2    A 6.5   2   0.40
4    2    A 7.3   3   0.60
5    1    B 7.1   1   0.25
6    1    B 7.7   3   0.75
7    2    B 7.7   2   0.40
8    2    B 7.4   3   0.60
...