2017-02-01 3 views
1

Sie möchten eine Spalte basierend auf den Werten von zwei Spalten, aber über mehr als eine Zeile hinzufügen. Dataset-CodeIfelse-Anweisung für mehrere Zeilen

Beispiel:

A = c(1,1,1,2,2,2,3,3,3,4,4) 
B = c(1,2,3,1,2,3,1,2,3,1,2) 
C = c(0,0,0,1,0,0,1,1,1,0,1) 
data <- data.frame(A,B,C) 

Datensatz:

A B C 
1 1 1 0 
2 1 2 0 
3 1 3 0 
4 2 1 1 
5 2 2 0 
6 2 3 0 
7 3 1 1 
8 3 2 1 
9 3 3 1 
10 4 1 0 
11 4 2 1 

IfElse Aussagen:

Was ich versuche, ist „Create Säule zu erreichen D .Wenn Spalte C == 1 in jede Zeile wo Spalte A == x, Spalte D = 1 Else Spalte D == 0"

gewünschte Ausgabe:

A B C D 
1 1 1 0 0 
2 1 2 0 0 
3 1 3 0 0 
4 2 1 1 1 
5 2 2 0 1 
6 2 3 0 1 
7 3 1 1 1 
8 3 2 1 1 
9 3 3 1 1 
10 4 1 0 1 
11 4 2 1 1 

Was ich getan habe, :

Ich habe heute darüber nachgedacht, aber kann keine logische Antwort finden, ich habe versucht, die Daten in langen und breiten Formaten zu betrachten, aber nichts sprang heraus.

Hinweis: In der tatsächlichen Anwendung die Anzahl der x in der Spalte erscheint C nicht gleich ist (einige eine Wiederholung in dem Datensatz enthalten, andere enthalten 20).

+1

Wenn Spalte C == 1 in jeder Zeile, in der Spalte A verwenden == x ???? , Spalte BBBB = 1. Sonst Spalte D == 0 " A = x? und D = 1 ?? sollte es A =" eine Nummer "und" B "= 1 ?? Brauchen Sie sogar Spalte B? – Mandar

+1

Spalte A hat kein "x" irgendwo. – Mandar

+0

@Mandar - Ich denke, sie bedeuten für jeden eindeutigen Wert in Spalte "A". Es ist * wirklich * unklar, obwohl. – thelatemail

Antwort

3
# just check using any() if any group has a single row with C==1 

library(dplyr) 
data %>% group_by(A) %>% mutate(D = as.numeric(any(C==1))) 

library(data.table) 
data[, D:=as.numeric(any(C==1)), by = .(A)] 
#  A  B  C  D 
#1  1  1  0  0 
#2  1  2  0  0 
#3  1  3  0  0 
#4  2  1  1  1 
#5  2  2  0  1 
#6  2  3  0  1 
#7  3  1  1  1 
#8  3  2  1  1 
#9  3  3  1  1 
#10  4  1  0  1 
#11  4  2  1  1 
+1

Excellent.Hat nicht die Funktion "any" zuvor gefunden. Vielen Dank –

0

Leicht mit data.table

library(data.table) 
data <- data.table(data) 
x=2 
data[,D:=ifelse(!A==x,ifelse(C==1,1,0),0)] 
data 
0

Wir ave von base R

data$D <- with(data, as.integer(ave(C==1, A, FUN=any))) 
data 
# A B C D 
#1 1 1 0 0 
#2 1 2 0 0 
#3 1 3 0 0 
#4 2 1 1 1 
#5 2 2 0 1 
#6 2 3 0 1 
#7 3 1 1 1 
#8 3 2 1 1 
#9 3 3 1 1 
#10 4 1 0 1 
#11 4 2 1 1