我有以下数据框,我需要忽略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值。
我希望实现的目标是......
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
谢谢!
答案 0 :(得分:6)
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
个值?计算中使用的任何列中的任何行?其他投入?结果呢?如何填充已删除的行仍具有相同的值?如上所述更好。
答案 1 :(得分:1)
以下是使用data.table
library(data.table)
setDT(firstlast)[, c("var_first", "var_last") := .(var_a[!is.na(var_a)][1],
tail(var_a[!is.na(var_a)], 1)),
, by = id][, change := var_last - var_first][]
# id var_a var_first var_last change
# 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