2011-09-27 14 views
11

Ho un frame di dati che assomiglia a questo:Come utilizzare ddply per aggiungere una colonna a un frame di dati?

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 

ho bisogno di aggiungere una colonna chiamata wt a questo dataframe che contiene il fattore di ponderazione necessari per calcolare la media ponderata. Questo fattore di ponderazione deve essere derivato per ciascuna combinazione di site e date.

L'approccio che sto utilizzando è quello di costruire prima una funzione che calcola il fattore di pesatura in:

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

quindi applicare la funzione per ogni combinazione di site e date

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

ma ottengo questo messaggio di errore:

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

prova 'df = ddply (. Df, (data, luogo), trasformare, in peso = peso (dil))' – Ramnath

+0

Grazie Ramnath, che ha funzionato perfettamente – matteo

risposta

15

Ci sei quasi. Modifica il tuo codice per utilizzare la funzione transform. Ciò consente di aggiungere colonne alla data.frame all'interno 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

Per usare ddply è necessario avere installato il pacchetto plyr – sshevlyagin

Problemi correlati