2016-03-18 1 views
0

Ich bin ein Newcomer zu dplyr und habe folgende Frage. Meine hat data.frame eine Spalte, die als eine Gruppierungsvariable dient. Einige Zeilen nicht gehören zu einer Gruppe, die Gruppierungsspalte ist NA.dplyr muate(): Werte ignorieren, wenn Gruppe ist NA

Ich muss dem data.frame einige Spalten hinzufügen, die die dplyr Funktion mutate verwenden. Ich würde es vorziehen, dass dplyr alle Zeilen ignoriert, in denen die Gruppierungsspalte NA entspricht. Ich werde mit einem Beispiel illustrieren:

library(dplyr) 

set.seed(2) 

# Setting up some dummy data 
df <- data.frame(
    Group = factor(c(rep("A",3),rep(NA,3),rep("B",5),rep(NA,2))), 
    Value = abs(as.integer(rnorm(13)*10)) 
) 

# Using mutate to calculate differences between values within the rows of a group 
df <- df %>% 
    group_by(Group) %>% 
    mutate(Diff = Value-lead(Value)) 

df 
# Source: local data frame [13 x 3] 
# Groups: Group [3] 
# 
#  Group Value Diff 
# (fctr) (int) (int) 
# 1  A  8  7 
# 2  A  1 -14 
# 3  A 15 NA 
# 4  NA 11 11 
# 5  NA  0 -1 
# 6  NA  1 -8 
# 7  B  7  5 
# 8  B  2 -17 
# 9  B 19 18 
# 10  B  1 -3 
# 11  B  4 NA 
# 12  NA  9  6 
# 13  NA  3 NA 

Berechnung der Unterschiede zwischen den Reihen ohne Gruppe macht keinen Sinn und wird die Daten korrumpieren. Ich brauche diese Zeilen zu entfernen und haben so wie dies getan:

df$Diff[is.na(df$Group)] <- NA 

Gibt es eine Möglichkeit den obigen Befehl in die dplyr-Kette mit%>% enthalten? Irgendwo in den Zeilen:

df <- df %>% 
    group_by(Group) %>% 
    mutate(Diff = Value-lead(Value)) %>% 
    filter(!is.na(Group)) 

Aber wo die Zeilen ohne eine Gruppe nicht alle zusammen entfernt werden? Oder noch besser, gibt es eine Möglichkeit, dplyr Zeilen ohne eine Gruppe zu ignorieren?

Es gewünschtes Ergebnis wäre:

# Source: local data frame [13 x 3] 
# Groups: Group [3] 
# 
#  Group Value Diff 
# (fctr) (int) (int) 
# 1  A  8  7 
# 2  A  1 -14 
# 3  A 15 NA 
# 4  NA 11 NA 
# 5  NA  0 NA 
# 6  NA  1 NA 
# 7  B  7  5 
# 8  B  2 -17 
# 9  B 19 18 
# 10  B  1 -3 
# 11  B  4 NA 
# 12  NA  9 NA 
# 13  NA  3 NA 

Antwort

4

einfach eine iflelse Bedingung für die Variable, die Sie versuchen, zu erstellen:

library(dplyr) 
set.seed(2) 

df = data.frame(
    Group = factor(c(rep("A",3), rep(NA,3), rep("B",5), rep(NA,2))), 
    Value = abs(as.integer(rnorm(13)*10)) 
) %>% 
    group_by(Group) %>% 
    mutate(Diff = ifelse(is.na(Group), as.integer(NA), Value-lead(Value))) 
+0

Übliche Nutzung ist 'NA_integer_' eine eingebaute Konstante, zu ihrer Information. – Frank

+0

@Frank Entspricht genau der gleichen Sache: 'identisch (as.integer (NA), NA_integer_)' und ich bin mir nicht so sicher über das "übliche". – tchakravarty

+0

Fair genug. Mit "gewöhnlich" meine ich nur den einzigen Weg, den ich je gesehen habe. – Frank