2016-04-19 5 views
2

I haben die folgenden Datenrahmen df mit den folgenden Spalten:Zusammenfassung von Daten basierend auf einem vorher eingestellten Zustand und das Hinzufügen eines (0,1) flag

df <- 
REP METRIC BE 
1  A  1 
2  A  0 
3  A  1 
1  B  1 
2  B  1 
3  B  1 
1  C  0 
2  C  1 
3  C  1 

I solche, die Daten von REP zusammenfassen möchte, dass für jeden eindeutigen REP wenn BE ist 1 für beide MetricA und B dann eine neue Spalte BEBOTH mit 1 sonst hinzuzufügen, ist es 0 (dh, wenn einer von ihnen gleich Null ist, dann ist BEBOTH Null). sein

sollte die Ausgabe:

REP BEBOTH 
    1  1 
    2  0 
    3  1 

Wie kann ich das in R? Ich traute, um ifelse Anweisung zu verwenden, aber ich habe das nicht richtig verstanden!

Antwort

1

Hier ist, was ich mit

library(dplyr) 
df <- data_frame(rep = c(1,2,3,1,2,3,1,2,3), 
      metric = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
      be  = c(1,0,1,1,1,1,1,1,0)) 

res <- df %>% 
group_by(rep) %>% 
mutate(beboth = ifelse(grep("A|B", metric) && be==0, 0, 1)) 

res 
#Source: local data frame [9 x 4] 
#Groups: rep [3] 
# 
# rep metric be beboth 
# (dbl) (chr) (dbl) (dbl) 
#1  1  A  1  1 
#2  2  A  0  0 
#3  3  A  1  1 
#4  1  B  1  1 
#5  2  B  1  0 
#6  3  B  1  1 
#7  1  C  1  1 
#8  2  C  1  0 
#9  3  C  0  1 

kam Wenn alles, was Sie über Pflege ist die rep und beboth Sie es zusammenfassen kann:

res.summarized <- df %>% 
    group_by(rep) %>% 
    mutate(beboth = ifelse(grep("A|B", metric) && be==0, 0, 1)) %>% 
    summarize(first(beboth)) 

res.summarized 
#Source: local data frame [3 x 2] 
# 
# rep first(beboth) 
# (dbl)   (dbl) 
#1  1    1 
#2  2    0 
#3  3    1 

bearbeiten: Ich habe meine Antwort aktualisiert, es zu haben schauen Sie sich nur A und B

+0

Eigentlich habe ich auch Metric 'C', die 'BE' Wert von 0 oder 1 hat Gibt es eine Möglichkeit Metric angeben Name in der ifelse-Anweisung anstelle von 'any (be == 0)'? – Amer

+0

@Amer also willst du es nur zusammenfassen A und B in Beboth? – AllanT

+0

Ja. BEBOTH sollte nur auf den "BE" -Wert von Metrik A und B konditioniert werden. Der Code wird nicht korrekt sein, wenn ich Metric C habe, das einen BE-Wert von 0 oder 1 hat. – Amer

1

Antwort mit Basispakete:

evaluate_BEBOTH <- function(x){ 
    subset_df <- df[x,] 

    if (sum(subset_df[,'BE']) == 2) 
     return (1) 
    else 
     return (0) 
} 

df$BEBOTH <- ave(1:nrow(df),df$REP,FUN = evaluate_BEBOTH) 

df 
    REP METRIC BE BEBOTH 
1 1  A 1  1 
2 2  A 0  0 
3 3  A 1  1 
4 1  B 1  1 
5 2  B 1  0 
6 3  B 1  1 
2

Wir können data.table verwenden. Konvertiere den 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'REP', wir erhalten die logische Bedingung und wickeln sie mit +, um auf numerisch zu konvertieren.

library(data.table) 
setDT(df)[, .(BEBOTH= +(any((METRIC=="A" & BE==1)) & any(METRIC=="B" & BE==1))) , by = REP] 
# REP BEBOTH 
#1: 1  1 
#2: 2  0 
#3: 3  1 

Oder mit der gleichen Logik mit dplyr

library(dplyr) 
df %>% 
    group_by(REP) %>% 
    summarise(BEBOTH = +(any(METRIC=="A" & BE==1) & any(METRIC=="B" & BE==1))) 
# REP BEBOTH 
# (int) (int) 
#1  1  1 
#2  2  0 
#3  3  1