Domanda

È facile prenderne uno o più in DDPHY per il processo, ma c'è un modo per afferrare l'intera riga corrente e passare a una funzione? O per prendere una serie di colonne determinate in fase di esecuzione?

Lasciami illustrare:

Dato un frame di dati simile

df = data.frame(a=seq(1,20), b=seq(1,5), c= seq(5,1))
df
    a b c
1   1 1 5
2   2 2 4
3   3 3 3

Potrei scrivere una funzione per sommare colonne denominate lungo una riga di un frame di dati come questo:

selectiveSummer = function(row,colsToSum) {
   return(sum(row[,colsToSum])) 
}

Funziona quando lo chiamo per una fila come questa:

> selectiveSummer(df[1,],c('a','c'))
[1] 6

Quindi mi piacerebbe avvolgerlo in una funzione anonima e usarlo in DDPLY per applicarlo a ogni riga del tavolo, qualcosa come l'esempio seguente

f = function(x) { selectiveSummer(x,c('a','c')) }
#this doesn't work!
ddply(df,.(a,b,c), transform, foo=f(row))

Mi piacerebbe trovare una soluzione in cui l'insieme di colonne da manipolare può essere determinato in fase di esecuzione, quindi se c'è un modo solo per schizzare quello dagli Arg di Ddply e trasmetterla in una funzione che assume un numero qualsiasi di Arg, che funziona anche.

Modifica: per essere chiari, la vera applicazione che guida questa non è una somma, ma questa è stata una spiegazione più semplice

È stato utile?

Soluzione

È possibile selezionare singole righe con DDPLY se le righe possono essere identificate in modo unico con una o più variabili. Se ci sono righe identiche, DDPHY si trasformerà su frame di dati di più righe anche se si utilizzano tutte le colonne (come ddply(df, names(df), f).

Perché non usare invece applicare? Applicare iterato su singole righe.

apply(df, 1, function(x) f(as.data.frame(t(x)))))

risultato:

[1]  6  6  6  6  6 11 11 11 11 11 16 16 16 16 16 21 21 21 21 21

Altri suggerimenti

Semplice...

df$id = 1:nrow(df)
ddply(df,c('id'),function(x){ ... })

O

adply(df,1,function(x){ ... })
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top