2017-07-11 1 views
1

Ich muss selektiv Werte aus einer Reihe von Spalten in meinem Datenrahmen über Zeilen hinweg hinzufügen. Werte können die Ganzzahlen 0, 1, 2 oder 3 annehmen. Die Summe von 2s und 3s (nicht die Anzahl von 2s und 3s, das ist einfach) gibt die "Intensität" dessen, was wir messen. Nehmen wir an, mein Datenrahmen wäre 60 Spalten lang, und ich wollte nur die Spalten 2 bis 11 betrachten. Der Excel-Code, um dies (in einer Richtung) zu erreichen, ist ziemlich trivial: =sumif(a2:a11,">1"). Dies würde alle 2s und 3s in diesem Bereich hinzufügen.Kurzer R-Code entspricht der Sumif-Funktion in Excel - besonders angewendet über Datenrahmen Zeilen

Während ich in der Vergangenheit aggregate() verwendet habe, waren die meisten Antworten zu diesem Thema nicht wirklich zu tun, was ich tun wollte, und ich war nicht in der Lage, einen Weg zu finden, aggregate() so zu funktionieren, wie ich erforderlich. Ich war auch verblüfft, indem ich versuchte, rowSums() dafür zu bekommen.

Schließlich wurde mir klar, ich folgendes tun könnte:

apply(data[,2:11], 1, function(x)sum(2*(x==2), 3*(x==3), na.rm=T)) 

Dies ist bei weitem die schnellste und eleganteste Weg, fand ich meine besondere gewünschte Verhalten entspricht Excel sumif replizieren.

Wenn jemand eine noch bessere Methode hat, würde ich mich freuen, es zu hören.

+0

'sum_row_if' von' expss' Paket : 'sum_row_if (gt (1), df [, 2:11])' Offenlegung: Ich bin der pa Ckage Autor. –

+0

Sehr hilfreich, danke Gregory. –

Antwort

2
#DATA 
set.seed(42) 
df = data.frame(matrix(sample(0:3, 250, replace = TRUE), ncol = 50)) 

Hier ist, wie Sie das tun würden mit rowSums()

rowSums(df[,2:11] * (df[,2:11] > 1), na.rm = TRUE) 
#[1] 18 13 11 19 11 

mit Ihrer Lösung Vergleichen

apply(df[,2:11], 1, function(x) sum(2*(x==2), 3*(x==3), na.rm=TRUE)) 
#[1] 18 13 11 19 11 
+1

Ah, das ist noch besser. Im Wesentlichen der gleiche Ansatz (von einem logischen Standpunkt), aber viel einfacherer Code. Das ist großartig, danke. –

1

Ein Vorschlag:

apply(data[,2:11], 1, function(x) sum(x[x %in% 2:3], na.rm = TRUE)) 
+1

Ah, sehr nützlich. % in% ist wahrscheinlich mein Lieblingsoperator für Datenverarbeitung. Ich kannte diese Verwendung nicht. Vielen Dank! –

Verwandte Themen