【问题标题】:R: new column of row difference from max value of another column according to groupR:根据组与另一列的最大值相差的新列
【发布时间】:2018-09-10 19:02:24
【问题描述】:

问题的标题可能不清楚,但我希望这些代码能清楚地说明我的问题。

我有一个包含三列的数据框。 $传感器(A和B);一天中的$小时(0-4);以及温度(1-5)所取的$值。

 new.df <- data.frame(
 sensor = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
 hour_day = c(0:4, 0:4),
 value = c(1, 1, 3, 1, 2, 1, 3, 4, 5, 2)

new.df

   sensor hour_day value
1       A        0     1
2       A        1     1
3       A        2     3
4       A        3     1
5       A        4     2
6       B        0     1
7       B        1     3
8       B        2     4
9       B        3     5
10      B        4     2

我想创建一个新列,根据传感器指示小时与最大值小时差。。 p>

想要的结果

   sensor value hour_day hour_from_max_hour
1       A     1        0                 -2
2       A     1        1                 -1
3       A     3        2                  0
4       A     1        3                  1
5       A     2        4                  2
6       B     1        0                 -3
7       B     3        1                 -2
8       B     4        2                 -1
9       B     5        3                  0
10      B     2        4                  1

请注意,对于传感器 A(最大值 = 2 小时)和传感器 B(最大值 = 3 小时)。我只想要一个新列,告诉我传感器值组与最大传感器值相差多少小时。

提前感谢您,如果我能提供更多信息,请告诉我。

编辑 以前的答案非常有帮助,我忘记了这个问题还有一个变量(天)。此外,有时一列中的最大值不止一个。在这种情况下,我想将差异基于 first 最大值。

df_add <- data.frame(
  sensor = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B",
               "A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
    hour_day = c(0:4, 0:4, 0:4, 0:4),
    value = c(1, 1, 3, 3, 2,
              3, 2, 4, 4, 1,
              1, 5, 6, 6, 2,
              2, 1, 3, 3, 1),
    day =   c(1, 1, 1, 1, 1, 
              1, 1, 1, 1, 1,
              2, 2, 2, 2, 2,
              2, 2, 2, 2, 2)
  
)

df_add

   sensor hour_day value day
1       A        0     1   1
2       A        1     1   1
3       A        2     3   1
4       A        3     3   1
5       A        4     2   1
6       B        0     3   1
7       B        1     2   1
8       B        2     4   1
9       B        3     4   1
10      B        4     1   1
11      A        0     1   2
12      A        1     5   2
13      A        2     6   2
14      A        3     6   2
15      A        4     2   2
16      B        0     2   2
17      B        1     1   2
18      B        2     3   2
19      B        3     3   2
20      B        4     1   2

【问题讨论】:

    标签: r max dplyr


    【解决方案1】:

    一个简单的管道就可以做到。您所要做的就是在mutate 指令中获取max(value)

    new.df %>%
        group_by(sensor) %>%
        mutate(hour_from_max_hour = hour_day - hour_day[which(value == max(value))[1]])
    ## A tibble: 10 x 4
    ## Groups:   sensor [2]
    #   sensor hour_day value hour_from_max_hour
    #   <fct>     <int> <dbl>              <int>
    # 1 A             0    1.                 -2
    # 2 A             1    1.                 -1
    # 3 A             2    3.                  0
    # 4 A             3    1.                  1
    # 5 A             4    2.                  2
    # 6 B             0    1.                 -3
    # 7 B             1    3.                 -2
    # 8 B             2    4.                 -1
    # 9 B             3    5.                  0
    #10 B             4    2.                  1
    

    【讨论】:

    • 我也有同样的想法,但我遇到了问题。
    • 谢谢,我没有预见到的一个问题是,有时在我的真实数据集中每个传感器的最大值不止一个。在这种情况下,我只想确定第一个最大值的差异。要实现这一点,需要对代码进行哪些修改?
    • @PanOle 你可以做which(value == max(value))[1]。我将编辑答案。
    【解决方案2】:
    library(dplyr)
    
    new.df.2 <- 
      # First get the hours with the max values
      new.df %>%
      group_by(sensor) %>%
      filter(value == max(value)) %>%
      ungroup() %>%
      select(sensor, max_hour = hour_day) %>%   # This renames hour_day as max_hour
      # Now join that to the original table and make the calculation
      right_join(new.df) %>%
      mutate(hour_from_max_hour = hour_day - max_hour)
    

    结果:

    new.df.2
    # A tibble: 10 x 5
       sensor max_hour hour_day value hour_from_max_hour
       <fct>     <int>    <int> <dbl>              <int>
     1 A             2        0     1                 -2
     2 A             2        1     1                 -1
     3 A             2        2     3                  0
     4 A             2        3     1                  1
     5 A             2        4     2                  2
     6 B             3        0     1                 -3
     7 B             3        1     3                 -2
     8 B             3        2     4                 -1
     9 B             3        3     5                  0
    10 B             3        4     2                  1
    

    【讨论】:

    • 非常感谢!这段代码很好用!我没有预见到的一个问题是,有时每个传感器的最大值不止一个。在这种情况下,我只想确定第一个最大值的差异。要实现这一点,需要对代码进行哪些修改?
    • 另外,如果我要再添加一个变量(列日期),我如何找到特定日期的传感器最大值。
    • group_by(sensor, date) %&gt;%...
    【解决方案3】:

    我可能会这样做:

    library(plyr)
    dd = ddply(new.df, .(sensor), summarize, 
               max.value = max(value),
               hour.of.max = hour_day[which.max(value)])
    new.df = merge(new.df, dd, all.x=T, by='sensor')
    new.df$hour_from_max_hour = new.df$hour_day - new.df$hour.of.max
    

    给了你一些额外的列,但你可以删除它们:

       sensor hour_day value max.value hour.of.max hour_from_max_hour
    1       A        0     1         3           2                 -2
    2       A        1     1         3           2                 -1
    3       A        2     3         3           2                  0
    4       A        3     1         3           2                  1
    5       A        4     2         3           2                  2
    6       B        0     1         5           3                 -3
    7       B        1     3         5           3                 -2
    8       B        2     4         5           3                 -1
    9       B        3     5         5           3                  0
    10      B        4     2         5           3                  1
    

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多