2016-07-20 5 views
2

Das ist mein Beispieldaten:andere Züge Mitgliedergruppe identifizieren als die Brenn Beobachtung {dplyr}

D <- data.frame(Family=c("A","A","A","B","B","B","c","c","c"), 
      Name=c("Adam","Amy","Aaron","Bob","Brian","Brandon","Chris","Claire", "Chloe"), 
      State=c("CA","PA","TX","CA","CA","CA","MA","MI","FL"), 
      stringsAsFactors = FALSE) 

    Family Name State 
1  A Adam CA 
2  A  Amy PA 
3  A Aaron TX 
4  B  Bob CA 
5  B Brian CA 
6  B Brandon CA 
7  c Chris MA 
8  c Claire MI 
9  c Chloe FL 

Ich brauche eine Funktion zu machen, die in der gleichen Gruppe, ob „Familienangehörige andere als die Brenn Reihe identifiziert "lebt in CA

I

require(dplyr) 
D1 <- D %>% group_by(Family) %>% 
mutate(Family.in.CA = any(State=="CA")) 


    Family Name State Family.in.CA 
    <fctr> <fctr> <fctr>  <lgl> 
1  A Adam  CA   TRUE 
2  A  Amy  PA   TRUE 
3  A Aaron  TX   TRUE 
4  B  Bob  CA   TRUE 
5  B Brian  CA   TRUE 
6  B Brandon  CA   TRUE 
7  c Chris  MA  FALSE 
8  c Claire  MI  FALSE 
9  c Chloe  FL  FALSE 

Aber meine gewünschte Funktion muss Adam FALSE sein versucht haben, seit in Adams Familie, keine Körper außer Adam lebt in CA.

UPDATE

Da die OP Verwirrung verursacht, zu erarbeiten, ich versuche, jede Zeile zu anderen Reihen in der gleichen Gruppe konnten

#Adam checks whether Amy or Aaron is in CA == FALSE 
#Amy checks whether Adam or Aaron is in CA == TRUE #Adam 
#Aaron checks whether Adam or Amy is in CA == TRUE #Adam 
#Bob checks whether Brian or Brandon is in CA == TRUE #Brian and Brandon 
... 

Antwort

1

Wir base R verwenden, um vergleichen zu mach das. Wir split den Datensatz von 'Familie', Schleife über die Zeilen, überprüfen, ob "CA" %in% ist, der "State" anders als die aktuelle Zeile, unsplit und erhalten Sie die Ausgabe als vector.

unsplit(lapply(split(D, D$Family), function(x) 
     sapply(1:nrow(x), function(i) { 
      x2 <- as.character(x$State[-i]) 
     "CA" %in% x2 
     })), D$Family) 
#[1] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE 

Wenn wir data.table verwenden, könnte dies in einem einzeiligen der hübscheste dplyr Code Dies ist

library(data.table) 
setDT(D)[, Family.in.CA := unlist(lapply(1:.N, function(i) "CA" %in% State[-i])), Family] 
D 
# Family Name State Family.in.CA 
#1:  A Adam CA  FALSE 
#2:  A  Amy PA   TRUE 
#3:  A Aaron TX   TRUE 
#4:  B  Bob CA   TRUE 
#5:  B Brian CA   TRUE 
#6:  B Brandon CA   TRUE 
#7:  c Chris MA  FALSE 
#8:  c Claire MI  FALSE 
#9:  c Chloe FL  FALSE 
+0

Adam hat keine Familie in CA, also wird er FALSCH sein. Amy hat Familie in CA, also wird sie WAHR sein. Wenn die Person in CA Familienmitglieder hat, sollte die Variable TRUE sein. – Jota

+0

@akrun was Jota sagt richtig –

+1

@akrun Danke für Ihre Zeit –

1

nicht Sie je gesehen haben getan werden, aber es wird die Arbeit geleistet:

D %>% group_by(Family) %>% 
    mutate(Family.in.CA = list(as.character(State))) %>% 
    mutate(Family.in.CA = 
     mapply(function(xx, yy) "CA" %in% yy[-match(xx, yy)], State, Family.in.CA)) 

#Source: local data frame [9 x 4] 
#Groups: Family [3] 
# 
# Family Name State Family.in.CA 
# <fctr> <fctr> <fctr>  <lgl> 
#1  A Adam  CA  FALSE 
#2  A  Amy  PA   TRUE 
#3  A Aaron  TX   TRUE 
#4  B  Bob  CA   TRUE 
#5  B Brian  CA   TRUE 
#6  B Brandon  CA   TRUE 
#7  c Chris  MA  FALSE 
#8  c Claire  MI  FALSE 
#9  c Chloe  FL  FALSE 

Es sammelt alle Staaten ein von allen Familienmitgliedern aus jeder Familie besetzt (ersten mutate). Dann entfernt es (eine Instanz von) den Zustand, in dem die Person in jeder Zeile von dieser Sammlung lebt und überprüft, ob "CA" in der verbleibenden Liste ist, die die Zustände anderer Familienmitglieder darstellt.

Verwandte Themen