2015-04-27 18 views
7

FragerowSums auf einer Säule

Gibt es eine Funktion oder eine Art und Weise rowSums zu bekommen nur eine Spalte zu arbeiten?

Beispieldaten

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

I rowSums können jeden Wert in einer Reihe für zwei oder mehrere definierte Spalten zusammenzufassen:

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

schlägt jedoch fehl, dies, wenn nur auf Säule geleitet wird

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

welche ma kes Sinn, wenn an der rowSums() Funktion suchen:

> 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 

Zusätzliche Informationen

Die Spalten werden von einem Benutzer in einer glänzenden App und gespeichert in einer Variablen ausgewählt werden. Diese Variable wird dann an rowSums übergeben. Der Benutzer kann eine oder mehrere Spalten auswählen.

Ich könnte eine ifelse-Anweisung erstellen, um die Länge der Variablen zu überprüfen, aber fragte mich, ob es eine bessere/elegantere/einzeilige Lösung gibt, die ich nicht sehe?

+6

gezwungen. Verwenden Sie drop = FALSE. dh. 'rowSums (df [, colsToAdd, drop = FALSE])' – akrun

+2

Sie können 'Reduce' auch verwenden, wenn Sie' NA's nicht in Ihren Daten haben, wie zum Beispiel 'Reduce (" + ", df [, colsToAdd]) 'sollte so schnell sein (wenn nicht schneller). Obwohl @akrun es definitiv geschafft hat. –

+0

Boom - 'drop = FALSE'. Danke @akrun. Willst du es eine Antwort geben? – tospig

Antwort

7

könnten Sie

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

versuchen ?'[' Nach standardmäßig

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

auf der Dokumentation Basierend

drop: Für Matrizen und Arrays. Wenn 'TRUE', wird das Ergebnis auf auf die niedrigstmögliche Dimension