2016-07-10 4 views
0

Ich habe einen Datenrahmen, der eine große Anzahl von Personen beschreibt. Ich möchte jede Person basierend auf mehreren Variablen einer Gruppe zuordnen. Nehmen wir zum Beispiel an, ich habe die Variable "state" mit 5 Zuständen, die Variable "age group" mit 4 Gruppen und die Variable "income" mit 5 Gruppen. Ich werde 5x4x5 = 100 Gruppen haben, die ich mit Zahlen von 1 bis 100 benennen möchte. Ich habe das in der Vergangenheit immer mit einer Kombination von ifelse-Anweisungen gemacht, aber jetzt, da ich 100 mögliche Ergebnisse habe, frage ich mich, ob es da ist ein schneller Weg, als jede Kombination von Hand zu spezifizieren.Wert einer Variablen basierend auf Werten in mehreren anderen Spalten zuweisen (Alternative zu ifelse)

Hier ist ein MWE mit dem erwarteten Ergebnis:

mydata <- as.data.frame(cbind(c("FR","UK","UK","IT","DE","ES","FR","DE","IT","UK"), 
c("20","80","20","40","60","20","60","80","40","60"),c(1,4,2,3,1,5,5,3,4,2))) 
colnames(mydata) <- c("Country","Age","Income") 

group_grid <- transform(expand.grid(state = c("IT","FR","UK","ES","DE"), 
     age = c("20","40","60","80"), income = 1:5), val = 1:100) 

desired_result <- as.data.frame(cbind(c("FR","UK","UK","IT","DE","ES","FR","DE","IT","UK"), 

             c("20","80","20","40","60","20","60","80","40","60"), 
             c(1,4,2,3,1,5,5,3,4,2), 
             c(2,78,23,46,15,84,92,60,66,33))) 

colnames(desired_result) <- c("Country","Age","Income","Group_code") 
+0

zeigen Ihnen ein kleines reproduzierbares Beispiel mit dem erwarteten Ausgang. Sie könnten ein Schlüssel-Dataset mit Werten erstellen, zB 'keyDat <- transform (expand.grid (state = 1: 5, age = 1: 4, einkommen = 1: 5), val = 1: 100)' (ersetzen Sie die Zahlen Mit den Daten können Sie die Werte in Ihren Originaldaten mit 'merge' oder' left_join' von 'dplyr' ändern – akrun

+0

Wenn Sie eine Zeile pro Gruppe haben/wollen, benutzen Sie einfach die rownames, zB' library (dplyr); expand.grid (state = 1: 5, age_group = 1: 4, Einkommen = 1: 5)%>% add_rownames ('group') ' – alistaire

+0

Ich muss alle Zeilen im ursprünglichen Datenrahmen behalten, mit einer neuen Spalte das sagt, welcher Gruppe jede Zeile gehört. – Astarte

Antwort

1

mydata$Group_code <- with(mydata, as.integer(interaction(Country, Age, Income))) sollte es tun.

0

Hier ist left_join Option dplyr

library(dplyr) 
grpD <- group_grid %>% 
      mutate_if(is.factor, as.character) %>% #change to character class as joining 
      mutate(income = as.character(income))#with same class columns are reqd. 
mydata %>% 
     mutate_if(is.factor, as.character) %>% #change class here too 
     left_join(., grpD, by= c("Country" = "state", "Age" = "age", "Income" = "income")) 
# Country Age Income val 
#1  FR 20  1 2 
#2  UK 80  4 78 
#3  UK 20  2 23 
#4  IT 40  3 46 
#5  DE 60  1 15 
#6  ES 20  5 84 
#7  FR 60  5 92 
#8  DE 80  3 60 
#9  IT 40  4 66 
#10  UK 60  2 33 
Verwandte Themen