奇怪的group_by + mutate + which.max行为

时间:2016-05-03 20:13:03

标签: r dplyr

我遇到dplyr的意外行为:

library(dplyr)

df <- structure(list(date = c("2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", "2016-05-02", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03", 
      "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", "2016-05-04", 
      "2016-05-04", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", 
      "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-05", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", "2016-05-06", 
      "2016-05-06", "2016-05-06"), abc = c(NA, NA, NA, NA, NA, NA, 
         NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
         NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
         NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 0, 0, 0, 
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 20, 16, 
         14, 9, 8, 6, 5, 5, 6, 7, 13, 24, 52, 65, 68, 66, 65, 58, 47, 
         21, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
         1, 1, 0, 0, 0, 0, 0, 10, 19, 19, 15, 11, 8, 8, 5, 4, 4, 4, 5, 
         9, 17, 31, 43, 49, 52, 52, 47, 32, 21, 6, 2, 1, 1, 1, 1, 1, 1, 
         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 5, 14, 
         14, 14, 15, 18, 18, 14, 14, 14, 15, 19, 29, 46, 58, 62, 69, 71, 
         67, 56, 40, 25, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
         2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 10, 18, 18, 14, 12, 9, 7, 5, 
         4, 5, 5, 7, 9, 17, 30, 36, 49, 52, 54, 54, 42, 32, 15, 5, 1)), 
     class = "data.frame", row.names = c(NA, -240L), .Names = c("date", "abc"))


df %>%
  group_by(date) %>%
  mutate(peak_max_index = as.numeric(which.max(as.numeric(abc))))

对于peak_max_index41的所有行,我希望返回的是date 2016-05-04。但奇怪的是,peak_max_indexNA。更奇怪的是,如果在运行date命令之前踢出2016-05-03dplyr的所有行,则结果完全正确。这是一个错误吗?

1 个答案:

答案 0 :(得分:-1)

您正在评估公式NA's中的which.max()。只需使用NA's消除!is.na()

df %>%
    group_by(date) %>%
    mutate(peak_max_index = max(df$abc[!is.na(df$abc)]))