/ / dplyr mutate (): ignoruje wartości, jeśli grupa jest NA - r, dplyr

dplyr mutate (): ignoruje wartości, jeśli grupa jest NA - r, dplyr

Jestem nowicjuszem dplyr i mam następujące pytanie. Mój ma data.frame jedna kolumna służąca jako zmienna grupująca. Niektóre wiersze don "t należą do grupy, której jest kolumna grupująca NA.

Potrzebuję dodać kilka kolumn do data.frame przy użyciu dplyr funkcjonować mutate. Wolałbym to dplyr ignoruje wszystkie wiersze, w których jest równa się kolumna grupująca NA. Zilustruję przykładem:

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

Obliczanie różnic między wierszami bez grupy nie ma sensu i powoduje uszkodzenie danych. Muszę usunąć te wiersze i zrobiłem tak w ten sposób:

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

Czy istnieje sposób włączenia powyższej komendy do łańcucha dplyr za pomocą%>%? Gdzieś w linii:

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

Ale gdzie wiersze bez grupy nie są usuwane razem? A nawet lepiej, czy jest jakiś sposób na zrobienie dplyr zignorować wiersze bez grupy?

Pożądany wynik byłby następujący:

# 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

Odpowiedzi:

4 dla odpowiedzi № 1

Po prostu użyj iflelse warunek dla zmiennej, którą próbujesz utworzyć:

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)))