Meine Frage besteht darin, Werte über mehrere Spalten eines Datenrahmens zu summieren und eine neue Spalte zu erstellen, die dieser Summierung entspricht dplyr
. Die Dateneinträge in den Spalten sind binär (0,1). Ich denke an ein zeilenweises Analogon der summarise_each
oder mutate_each
Funktion von dplyr
. Unten finden Sie ein minimales Beispiel für den Datenrahmen:
library(dplyr)
df=data.frame(
x1=c(1,0,0,NA,0,1,1,NA,0,1),
x2=c(1,1,NA,1,1,0,NA,NA,0,1),
x3=c(0,1,0,1,1,0,NA,NA,0,1),
x4=c(1,0,NA,1,0,0,NA,0,0,1),
x5=c(1,1,NA,1,1,1,NA,1,0,1))
> df
x1 x2 x3 x4 x5
1 1 1 0 1 1
2 0 1 1 0 1
3 0 NA 0 NA NA
4 NA 1 1 1 1
5 0 1 1 0 1
6 1 0 0 0 1
7 1 NA NA NA NA
8 NA NA NA 0 1
9 0 0 0 0 0
10 1 1 1 1 1
Ich könnte so etwas gebrauchen wie:
df <- df %>% mutate(sumrow= x1 + x2 + x3 + x4 + x5)
Dies würde jedoch das Aufschreiben der Namen jeder der Spalten beinhalten. Ich habe gerne 50 Spalten. Darüber hinaus ändern sich die Spaltennamen bei verschiedenen Iterationen der Schleife, in der ich diese Operation implementieren möchte, sodass ich versuchen möchte, keine Spaltennamen anzugeben.
Wie kann ich das am effizientesten machen? Jede Unterstützung wäre sehr dankbar.
dplyr
? Warum nicht einfach eine einfachedf$sumrow <- rowSums(df, na.rm = TRUE)
von Basis R? Oderdf$sumrow <- Reduce(`+`, df)
wenn Sie genau das replizieren möchten, was Sie getan habendplyr
.dplyr
wie indf %>% mutate(sumrow = Reduce(`+`, .))
oderdf %>% mutate(sumrow = rowSums(.))
dplyr
Version und es wird funktionieren.Antworten:
Wie wäre es mit
Fassen Sie jede Spalte zusammen
Fassen Sie jede Zeile zusammen
quelle
summarise_each
summiert sich entlang jeder Spalte, während die Summe entlang jeder Zeile erforderlich ist(.[1:5])
Teil ändern , aber leider bin ich weder mit der Syntax vertraut noch weiß ich nicht, wie ich Hilfe dazu suchen soll. Versucht mitmutate(sum = rowSums(is.numeric(.)))
, aber nicht funktioniert.df %>% replace(is.na(.), 0) %>% select_if(is.numeric) %>% summarise_each(funs(sum))
?summarise_all
stattsummarise_each
wie veraltet.mutate(sum = rowSums(.[,-1]))
kann nützlich sein, wenn Sie nicht wissen, mit wie vielen Spalten Sie arbeiten müssen.Wenn Sie nur bestimmte Spalten summieren möchten, würde ich Folgendes verwenden:
Auf diese Weise können Sie die
dplyr::select
Syntax verwenden.quelle
Ich würde Matching mit regulären Ausdrücken verwenden, um Variablen mit bestimmten Musternamen zu summieren. Beispielsweise:
Auf diese Weise können Sie mehr als eine Variable als Summe bestimmter Variablengruppen Ihres Datenrahmens erstellen.
quelle
-
Zeichen:rowSums(.[-grep("x[3-5]", names(.))], na.rm = TRUE)
Die Verwendung von
reduce()
frompurrr
ist etwas schneller alsrowSums
und definitiv schneller alsapply
, da Sie das Durchlaufen aller Zeilen vermeiden und nur die vektorisierten Operationen nutzen:Siehe dies für Timings
quelle
na.rm = TRUE
rowSums(select(., matches("myregex")) , na.rm = TRUE))
Am Ende tat ich das, weil ich genau das brauchte, um NAs zu ignorieren. Wenn die Zahlensum(NA, 5)
also 5 sind, haben Sie gesagt, dass Reduzieren besser ist alsrowSums
das. Ich habe mich gefragt, ob es in dieser Situation eine Möglichkeit gibt, es zu verwenden.rowSums
Version wahrscheinlich die beste. Der Hauptnachteil ist, dass nurrowSums
undrowMeans
verfügbar sind (es ist etwas langsamer als zu reduzieren, aber nicht viel). Wenn Sie eine andere Operation ausführen müssen (nicht die Summe),reduce
ist wahrscheinlich die Version die einzige Option. Vermeiden Sieapply
in diesem Fall nur die Verwendung .Ich stoße häufig auf dieses Problem, und der einfachste Weg, dies zu tun, besteht darin, die
apply()
Funktion innerhalb einesmutate
Befehls zu verwenden.Hier können Sie alles verwenden, was Sie möchten, um die Spalten mit den Standardtricks
dplyr
(z . B.starts_with()
odercontains()
) auszuwählen . Wenn Sie die gesamte Arbeit in einem einzigenmutate
Befehl ausführen, kann diese Aktion an einer beliebigen Stelle innerhalb einesdplyr
Stroms von Verarbeitungsschritten ausgeführt werden. Schließlich haben Sie durch die Verwendung derapply()
Funktion die Flexibilität, jede benötigte Zusammenfassung zu verwenden, einschließlich Ihrer eigenen speziell entwickelten Zusammenfassungsfunktion.Wenn die Idee, eine nicht-tidyverse-Funktion zu verwenden, nicht ansprechend ist, können Sie alternativ die Spalten zusammenfassen, zusammenfassen und das Ergebnis schließlich wieder mit dem ursprünglichen Datenrahmen verbinden.
Hier habe ich die
starts_with()
Funktion verwendet, um die Spalten auszuwählen und die Summe zu berechnen, und Sie können mitNA
Werten tun, was Sie wollen . Der Nachteil dieses Ansatzes ist, dass er zwar ziemlich flexibel ist, aber nicht wirklich in einendplyr
Strom von Datenbereinigungsschritten passt .quelle
apply
wenn dies das ist, wofürrowSums
es entwickelt wurde.rowSums
funktioniert das wirklich gutrowMeans
, aber ich habe mich immer ein bisschen komisch gefragt: "Was ist, wenn das, was ich berechnen muss, keine Summe oder kein Mittelwert ist?" In 99% derapply
Fälle, in denen ich so etwas tun muss, handelt es sich entweder um eine Summe oder um einen Mittelwert . Daher ist die zusätzliche Flexibilität bei der Verwendung der allgemeinen Funktion möglicherweise nicht gewährleistet.