2016-03-31 5 views
1

Ich habe ein Datenrahmen df genannt, der wie dieser eine neue Spalte PERCENTAGE_ORANGUTAN die als ORANGUTAN/SUM(previous_columns)Wenn ich eine berechnete Spalte anlege, wie summiere ich Spalten mit dplyr?

Ich weiß, berechnet würde genannt machen

GENDER,CHOCOLATE,VANILLA,...A_BUNCH_OF_COLUMNS_HERE...,ORANGUTAN 
M,11,22,...,33 
F,22,33,...,44 
M,22,11,...,22 
F,44,55,...,66 

Ich möchte aussieht wie eine berechnete Spalte machen mit dplyrwenn Ich kenne die Namen der Spalten vor ORANGUTAN. Aber wenn ich nicht die Namen oder die Anzahl der Spalten vor ORANGUTAN weiß, wie berechne ich PERCENTAGE_ORANGUTAN? Oder ohne dplyr?

Antwort

4

Möglicherweise gibt es ein "dplyr-ish" Idiom, aber wenn Sie wissen, dass Sie alle Spalten vor der ORANGUTAN Spalte möchten, können Sie match verwenden, um sie auszuwählen. die eingebaute in mtcars Datenrahmen beispielsweise mit:

mtcars %>% 
    mutate(pct = wt/rowSums(.[ , 1:(match("wt", names(.))-1)])) 

Der obige Code erstellt eine neue Spalte namens pct durch die wt Spalte durch die Summe aller Spalten Dividieren vorhergehenden sie (die nicht-sensical und gerecht zur Illustration).

. ist ein "Pronomen", das sich auf den Datenrahmen mtcars bezieht.

Wir wollen die Summe der Spalten 1 durch die Spalte vor wt. match gibt den numerischen Index wt im Vektor der Spaltennamen mtcars zurück. Dieser Wert geschieht 6, zu sein, so dass wir 1 subtrahieren daraus die Summe der Spalten 1 bis 5

0

In Basis zu erhalten:

Zuerst werden wir alle Spalten entfernen, die nicht numerisch sind:

df1 <- df[,sapply(df, is.numeric)] 

dann durch diejenigen Teilmenge, die einen Index größer als 'ORANGUTAN' haben, und dividieren:

df$new <- df1$ORANGUTAN/rowSums(df1[ , 1:which(names(df1) == 'ORANGUTAN')]) 

geben:

[1] 0.5000000 0.4444444 0.4000000 0.4000000 

Daten:

df = read.table(text = "GENDER,CHOCOLATE,VANILLA,ORANGUTAN 
M,11,22,33 
F,22,33,44 
M,22,11,22 
F,44,55,66", sep = ',', header = TRUE) 
Verwandte Themen