Come posso usare i nomi delle variabili per consultare i dati del telaio colonne con ddply?

StackOverflow https://stackoverflow.com/questions/8869005

  •  28-10-2019
  •  | 
  •  

Domanda

Sto cercando di scrivere una funzione che prende come argomenti il nome di un frame di dati il tempo di permanenza in serie di dati e il nome di una colonna in che frame di dati.La funzione esegue varie manipolazioni sui dati, uno dei quali è l'aggiunta di un totale di esecuzione per ogni anno in una colonna.Sto usando plyr.

Quando si utilizza il nome della colonna direttamente con ddply e cumsum non ho problemi:

require(plyr)
df <- data.frame(date = seq(as.Date("2007/1/1"),
                     by = "month",
                     length.out = 60),
                 sales = runif(60, min = 700, max = 1200))

df$year <- as.numeric(format(as.Date(df$date), format="%Y"))
df <- ddply(df, .(year), transform,
            cum_sales = (cumsum(as.numeric(sales))))

Questo è tutto bene e buono, ma l'obiettivo finale è quello di essere in grado di passare il nome di una colonna di questa funzione.Quando si tenta di utilizzare una variabile al posto del nome della colonna, non funziona come mi aspettavo:

mycol <- "sales"
df[mycol]

df <- ddply(df, .(year), transform,
            cum_value2 = cumsum(as.numeric(df[mycol])))

Pensavo di sapere come accedere a colonne per nome.Questo mi preoccupa, perché suggerisce che non sono riuscito a capire qualcosa di base sull'indicizzazione e di estrazione.Avrei pensato che in riferimento alle colonne per nome, in questo modo sarebbe un bisogno comune.

Ho due domande.

  1. Che cosa sto facendo di sbagliato, cioèche cosa ho frainteso?
  2. C'è un modo migliore per andare su questo, tenendo presente che i nomi delle colonne non essere conosciuta dalla funzione?

TIA

È stato utile?

Soluzione

Gli argomenti ddply sono espressioni che vengono valutati nel contesto di ogni parte originale frame di dati è diviso in.Il df[miavar] rivolto a tutto il frame di dati, quindi non si può passare così com'è (a proposito, perché hai bisogno di quelli come.numerico(come.carattere()) roba - sono completamente inutili).

Il modo più semplice sarà quello di scrivere una propria funzione che fa di tutto all'interno e passare la colonna del nome, ad es.

df <- ddply(df, 
            .(year), 
            .fun = function(x, colname) transform(x, cum_sales = cumsum(x[,colname])), 
            colname = "sales")

Altri suggerimenti

Il problema è che ddply si aspetta che i suoi ultimi argomenti espressioni, che sarà valutata su blocchi di dati.telaio (ogni anno, nel tuo esempio).Se si utilizza df[myval], avete tutti i dati.telaio, non annuale blocchi.

Le seguenti opere, ma non è molto elegante:Ho costruito l'espressione come una stringa, e poi convertire con eval(parse(...)).

ddply( df, .(year), transform, 
  cum_value2 = eval(parse( text = 
    sprintf( "cumsum(as.numeric(as.character(%s)))", mycol )
  ))
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top