2016-05-18 5 views
1

ich einen Datenrahmen haben, die wie folgt aussieht:Erstellen Sie neue kategorische Variable basierend auf einer Teilmenge von Daten

  cnt bnk qst ans 
1 Country 1 Bank 1 q1 1 
2 Country 2 Bank 2 q1 1 
3 Country 3 Bank 3 q1 3 
4 Country 4 Bank 4 q1 1 
5 Country 1 Bank 1 q2 1 
6 Country 2 Bank 2 q2 2 
7 Country 3 Bank 3 q2 3 
8 Country 4 Bank 4 q2 4 
9 Country 1 Bank 1 q3 1 
10 Country 2 Bank 2 q3 1 
11 Country 3 Bank 3 q3 2 
12 Country 4 Bank 4 q3 1 

Zu Ihrer Information q ‚s für‚Frage‘stehen. Also, q2 ist "Frage 2". In ähnlicher Weise sind ans die Antworten.

Jetzt möchte ich eine kategoriale Variable basierend auf den Antworten in q2 erstellen. Insbesondere mag ich die folgenden Kategorien zuzuordnen:

  1. öffentlichen
  2. Privat
  3. gemischte
  4. Andere

Also, wenn die ans=1-qst=q2, das ist "Public", wenn ans=2 zu qst=q2 das ist "Private" usw. So sollte mein Datenrahmen danach so aussehen:

  cnt bnk qst ans dummy 
1 Country 1 Bank 1 q1 1 Public 
2 Country 2 Bank 2 q1 1 Private 
3 Country 3 Bank 3 q1 3 Mixed 
4 Country 4 Bank 4 q1 1 Other' 
5 Country 1 Bank 1 q2 1 Public 
6 Country 2 Bank 2 q2 2 Private 
7 Country 3 Bank 3 q2 3 Mixed 
8 Country 4 Bank 4 q2 4 Other' 
9 Country 1 Bank 1 q3 1 Public 
10 Country 2 Bank 2 q3 1 Private 
11 Country 3 Bank 3 q3 2 Mixed 
12 Country 4 Bank 4 q3 1 Other' 

Ich habe versucht, die ifelse zu verwenden, aber ich habe nicht getan, was ich will. Kann mir jemand Vorschläge machen, wie ich das machen kann?

DATA

dput(df) 
structure(list(cnt = c("Country 1", "Country 2", "Country 3", 
"Country 4", "Country 1", "Country 2", "Country 3", "Country 4", 
"Country 1", "Country 2", "Country 3", "Country 4"), bnk = c("Bank 1", 
"Bank 2", "Bank 3", "Bank 4", "Bank 1", "Bank 2", "Bank 3", "Bank 4", 
"Bank 1", "Bank 2", "Bank 3", "Bank 4"), qst = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("q1", 
"q2", "q3"), class = "factor"), ans = c(1L, 1L, 3L, 1L, 1L, 2L, 
3L, 4L, 1L, 1L, 2L, 1L), dummy = c(NA, NA, NA, NA, "Public", 
"Private", "Mixed", "Other", NA, NA, NA, NA)), .Names = c("cnt", 
"bnk", "qst", "ans", "dummy"), row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame") 
+0

Der zweite Eintrag ist 'Private' aber' ans = 1 ' – Sotos

+0

ja, weil ich nicht für 'q1' über den' ans' kümmern, sondern um 'q2' . – msh855

Antwort

1

Die follwing wird NA für alle anderen Qs setzen,

df$dummy <- ifelse(df$ans == 1 & df$qst == 'q2', 'Public', 
       ifelse(df$ans == 2 & df$qst == 'q2', 'Private', 
        ifelse(df$ans == 3 & df$qst == 'q2', 'Mixed', 
         ifelse(df$ans == 4 & df$qst == 'q2', 'Other', NA)))) 

#   cnt bnk qst ans dummy 
#1 Country 1 Bank 1 q1 1 <NA> 
#2 Country 2 Bank 2 q1 1 <NA> 
#3 Country 3 Bank 3 q1 3 <NA> 
#4 Country 4 Bank 4 q1 1 <NA> 
#5 Country 1 Bank 1 q2 1 Public 
#6 Country 2 Bank 2 q2 2 Private 
#7 Country 3 Bank 3 q2 3 Mixed 
#8 Country 4 Bank 4 q2 4 Other 
#9 Country 1 Bank 1 q3 1 <NA> 
#10 Country 2 Bank 2 q3 1 <NA> 
#11 Country 3 Bank 3 q3 2 <NA> 
#12 Country 4 Bank 4 q3 1 <NA> 
1

So etwas wie die folgenden werden für eine data.frame namens df arbeiten. Es ist schwierig, ohne Daten zu testen:

# construct dummy variable in subset data.frame 
dfCountryQ2 <- df[df$qst=="q2", c("cnt", "ans")] 
dfCountryQ2$dummy <- factor(dfCountryQ2$ans, levels=1:4, 
          labels=c("Public", "Private", "Mixed", "Other")) 

# merge on by country 
df <- merge(df, dfCountryQ2[, c("cnt", "dummy")], by="cnt") 
Verwandte Themen