我有以下数据框,我需要忽略 id 9 的最后一个值的缺失值。
firstlast <- data.frame(id = as.factor(c("01", "01", "01", "01", "01", "04", "04", "05", "05", "05", "05", "05", "09", "09", "09", "09", "09")),
var_a = c(13, 21, 32, 33, 44, 21, 33, 35, 17, 18, 21, 22, 17, 13, 33, 32, NA))
df 看起来像:
id var_a
1 01 13
2 01 21
3 01 32
4 01 33
5 01 44
6 04 21
7 04 33
8 05 35
9 05 17
10 05 18
11 05 21
12 05 22
13 09 17
14 09 13
15 09 33
16 09 32
17 09 NA
到目前为止我的尝试:
firstlast <- firstlast %>% group_by(id) %>%
mutate(var_first = first(var_a)) %>%
mutate(var_last = last(var_a)) %>%
mutate(change = var_last - var_first)
创建:
id var_a var_first var_last change
(fctr) (dbl) (dbl) (dbl) (dbl)
1 01 13 13 44 31
2 01 21 13 44 31
3 01 32 13 44 31
4 01 33 13 44 31
5 01 44 13 44 31
6 04 21 21 33 12
7 04 33 21 33 12
8 05 35 35 22 -13
9 05 17 35 22 -13
10 05 18 35 22 -13
11 05 21 35 22 -13
12 05 22 35 22 -13
13 09 17 17 NA NA
14 09 13 17 NA NA
15 09 33 17 NA NA
16 09 32 17 NA NA
17 09 NA 17 NA NA
但是,我需要忽略 id 9 的最后一个 NA 观察值的缺失值,而是使用倒数第二个(或第一个观察值)。当我包含
mutate(var_last = last(var_a), na.rm=TRUE)
在该行,我得到一整列 na.rm = TRUE 并且不忽略 NA 值。我希望实现的最终 df 是...
id var_a var_first var_last change
(fctr) (dbl) (dbl) (dbl) (dbl)
1 01 13 13 44 31
2 01 21 13 44 31
3 01 32 13 44 31
4 01 33 13 44 31
5 01 44 13 44 31
6 04 21 21 33 12
7 04 33 21 33 12
8 05 35 35 22 -13
9 05 17 35 22 -13
10 05 18 35 22 -13
11 05 21 35 22 -13
12 05 22 35 22 -13
13 09 17 17 32 15
14 09 13 17 32 15
15 09 33 17 32 15
16 09 32 17 32 15
17 09 NA 17 32 15
谢谢!
最佳答案
mutate
没有 na.rm
选项,也没有 first()
或 last()
在这里更合适。您可以使用 na.omit
自己省略缺失值:
firstlast <- firstlast %>% group_by(id) %>%
mutate(
var_first = first(na.omit(var_a)),
var_last = last(na.omit(var_a)),
change = var_last - var_first
)
# Source: local data frame [17 x 5]
# Groups: id [4]
#
# id var_a var_first var_last change
# (fctr) (dbl) (dbl) (dbl) (dbl)
# 1 01 13 13 44 31
# 2 01 21 13 44 31
# 3 01 32 13 44 31
# 4 01 33 13 44 31
# 5 01 44 13 44 31
# 6 04 21 21 33 12
# 7 04 33 21 33 12
# 8 05 35 35 22 -13
# 9 05 17 35 22 -13
# 10 05 18 35 22 -13
# 11 05 21 35 22 -13
# 12 05 22 35 22 -13
# 13 09 17 17 32 15
# 14 09 13 17 32 15
# 15 09 33 17 32 15
# 16 09 32 17 32 15
# 17 09 NA 17 32 15
作为旁注,给出
mutate
na.rm
争论没有多大意义。什么 NA
你会省略值吗?计算中使用的任何列中的任何行?其他输入?只是结果?您将如何填充已删除的行以保持相同的值?像上面那样明确要好得多。
关于r - 首先和最后使用 dplyr 但忽略 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38230305/