2015-04-27 10 views
7

DomandarowSums su una colonna

C'è una funzione o un modo per ottenere rowSums a lavorare su una sola colonna?

Esempio Dati

col1 <- c(1,2,3) 
col2 <- c(1,2,3) 
df <- data.frame(col1, col2) 

posso usare rowSums riassumere ciascun valore in una fila per due o più colonne definite:

colsToAdd <- c("col1", "col2") 
rowSums(df[,colsToAdd]) 
[1] 2 4 6 

Tuttavia, ciò non riesce quando solo su colonna viene passata

colsToAdd <- c("col1") 
rowSums(df[,colsToAdd]) 
Error in rowSums(df[, colsToAdd]) : 
    'x' must be an array of at least two dimensions 

quale ma KES senso quando guardando la funzione rowSums():

> rowSums 
function (x, na.rm = FALSE, dims = 1L) 
{ 
    if (is.data.frame(x)) 
     x <- as.matrix(x) 
    if (!is.array(x) || length(dn <- dim(x)) < 2L) 
    ## This line 'stops' the function if only one column is passed 

informazioni aggiuntive

Le colonne saranno selezionati da un utente in un'applicazione Shiny e memorizzati in una variabile. Questa variabile viene quindi passata a rowSums. L'utente può selezionare una o più colonne.

Potrei costruire un'istruzione ifelse per controllare la lunghezza della variabile, ma mi chiedevo se c'è una soluzione migliore/più elegante/a linea singola che non vedo?

+6

Utilizzare drop = FALSE. vale a dire. 'rowSums (df [, colsToAdd, drop = FALSE])' – akrun

+2

Puoi anche usare 'Riduci 'se non hai' NA's nei tuoi dati, come 'Riduci (" + ", df [, colsToAdd]) 'che dovrebbe essere il più veloce (se non più veloce). Anche se @akrun l'ha sicuramente inchiodato. –

+0

boom - 'drop = FALSE'. Grazie @akrun. Vuoi farne una risposta? – tospig

risposta

7

Si potrebbe provare

rowSums(df[,colsToAdd, drop=FALSE]) 

Secondo ?'[', per impostazione predefinita,

x[i, j, ... , drop = TRUE] 

sulla base della documentazione

calo: per le matrici e le matrici. Se "VERO" il risultato è forzato a la dimensione più bassa possibile

Problemi correlati