首页 > 解决方案 > R:根据组与另一列的最大值相差的新列

问题描述

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

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

 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

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

期望的结果

   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)。我只想要一个新列,告诉我传感器值组与最大传感器值相差多少小时。

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

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

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

标签: rmaxdplyr

解决方案


一个简单的管道就可以做到。你所要做的就是接受max(value)指令mutate

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

推荐阅读