2011-09-27 14 views
11

que tienen una trama de datos que tiene este aspecto:¿Cómo usar ddply para agregar una columna a un marco de datos?

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 

necesito agregar una columna llamada wt a esta trama de datos que contiene el factor de ponderación necesaria para calcular la media ponderada. Este factor de ponderación tiene que derivarse para cada combinación de site y date.

El enfoque que estoy usando es construido por primera vez una función que calcular el factor weigthing:

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

a continuación, aplicar la función para cada combinación de site y date

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

pero consigo este mensaje de error:

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

intento 'df = ddply (. Df, (fecha, lugar), transformar, peso = peso (DIL))' – Ramnath

+0

Gracias Ramnath, que funcionó perfectamente – matteo

Respuesta

15

Ya casi has llegado. Modifique su código para usar la función transform. Esto le permite añadir columnas a la hoja.de.datos dentro 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 
+1

Para usar ddply necesita tener el paquete plyr instalado – sshevlyagin

Cuestiones relacionadas