2016-11-18 6 views
2

Ich bin neugierig, wie Sie dieses Problem lösen können. Ich habe Datenrahmen wie folgt aus:Spalte basierend auf Werten in anderen Spalten Datenrahmen hinzufügen r

a b  
1 0  
1 0 
0 1 
1 1 
0 0 
1 0 

Dann wird der Ausgang besitzt eine zusätzliche Spalte basierend auf den Werten von "a" und "b":

if (a == 1 & b == 1) c = 1, wenn (a == 1 & b == 0) c = 2, wenn (a == 0 & b == 1) c = 3, sonst c = 4.

a b c 
1 0 2 
1 0 2 
0 1 3 
1 1 1 
0 0 4 
1 0 2 

Irgendwelche Gedanken? Ich schreibe keine for-Schleife mit verschachteltem if-else, wie könnten wir vektorisieren? Vielen Dank!

+0

df $ c = ifelse (df a == 1 & df $ $ b == 1, 1, ifelse (df $ a == 1 & df $ b == 0, 2, ifelse (df a $ == 0 & df $ b == 1, 3, 4))) –

+0

Guter Punkt! Ich vergesse das total ... danke –

+0

Check out 'switch()' auch – CephBirk

Antwort

6

interaction wird wettgemacht:

c(4,2,3,1)[interaction(df)] 
#[1] 2 2 3 1 4 2 
+0

Das ist verrückt einfach. Schöner Fund! – CephBirk

+0

Toll den Trick zu kennen! Sehr einfach! Danke vielmals! –

2

Dies wird auch funktionieren:

library(dplyr) 
inner_join (df, cbind(expand.grid(0:1, 0:1), c=c(4, 2, 3, 1)), 
       by=c('a'='Var1', 'b'='Var2')) 

    a b c 
1 1 0 2 
2 1 0 2 
3 0 1 3 
4 1 1 1 
5 0 0 4 
6 1 0 2 
1

Mit ein wenig der linearen Algebra:

brauchen wir für x zu lösen, y aus die Gleichung c = 4 - x a - y b wir können sehen x = 2, y = 1 ist die Lösung gegeben die Menge der Variablen Werte

a b c 
0 0 4 
1 0 2 
0 1 3 
1 1 1 

oder wir können die limSolve verwenden diese überbestimmten Satz von Gleichungen zu lösen:

library(limSolve) 
res <- Solve(as.matrix(expand.grid(0:1, 0:1)), 4-c(4, 2, 3, 1)) 
res 
Var1 Var2 # a = Var1, b = Var2 
    2 1 

Daher haben wir:

df$c <- 4 - res[1]*df$a - res[2]*df$b 
df 
a b c 
1 1 0 2 
2 1 0 2 
3 0 1 3 
4 1 1 1 
5 0 0 4 
6 1 0 2 
1

Ordnen Sie Ihre gewünschten c-Werte ein Vektor und verwenden Sie die Werte a und b als Indizes (bei 1-basierter Indizierung um 1 inkrementieren).

foo <- data.frame(a=c(1,1,0,1,0,1), b=c(0,0,1,1,0,0)) 

data.frame(foo, c=c(4:1)[foo$a*2 + foo$b + 1]) 

# a b c 
# 1 1 0 2 
# 2 1 0 2 
# 3 0 1 3 
# 4 1 1 1 
# 5 0 0 4 
# 6 1 0 2 
Verwandte Themen