Sto provando a creare una colonna in un frame di dati molto grande (~ 2,2 milioni di righe) che calcola la somma cumulativa di 1 per ciascun livello di fattore e si ripristina quando viene raggiunto un nuovo livello di fattore. Di seguito sono riportati alcuni dati di base che assomigliano al mio.vectorize cumsum per factor in R
itemcode <- c('a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a4', 'a4', 'a5', 'a6', 'a6', 'a6', 'a6')
goodp <- c(0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1)
df <- data.frame(itemcode, goodp)
vorrei che la variabile di uscita, cum.goodp, per assomigliare a questo:
cum.goodp <- c(0, 1, 2, 0, 1, 1, 2, 0, 0, 1, 1, 1, 2, 0, 1)
Capisco che c'è un sacco là fuori utilizzando l'approccio canonico split-apply-combine, che , concettualmente è intuitivo, ma ho provato ad utilizzare il seguente:
k <- transform(df, cum.goodp = goodp*ave(goodp, c(0L, cumsum(diff(goodp != 0)), FUN = seq_along, by = itemcode)))
Quando provo a eseguire questo codice è molto molto lento. Ho capito che la trasformazione è parte del motivo per cui (il "da" non aiuta neanche). Ci sono oltre 70K diversi valori per la variabile codice articolo, quindi dovrebbe essere probabilmente vettorizzato. C'è un modo per vettorializzare questo, usando cumsum? In caso contrario, qualsiasi aiuto sarebbe veramente apprezzato. Grazie mille.
Puoi mostrare l'output previsto per favore? –
@akrun è una domanda r – jvalenti
Forse stai cercando 'transform (df, cum.goodp = ave (goodp, itemcode, FUN = cumsum))' ma non è chiaro per me .. –