首先使用dplyr,但忽略NA值

时间:2016-07-06 17:38:09

标签: r dplyr

我有以下数据框,我需要忽略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

谢谢!

2 个答案:

答案 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