使用计算的标签从groupby创建一列

时间:2018-09-13 17:19:32

标签: r dataframe dplyr grouping

我有一个数据框,我想根据另一列上的groupby创建一个数据框列。分组依据应在列上以50为增量,标签应为分组编号中的中间数字。我在这里用可重现的示例进行演示。

这是数据框

das <- data.frame(val=1:27,
              weigh=c(20,25,37,38,50,52,56,59,64,68,69,70,75,76,82,85,90,100,109,150,161,178,181,179,180,201,201))

    val  weigh
1     1  20
2     2  25
3     3  37
4     4  38
5     5  50
6     6  52
7     7  56
8     8  59
9     9  64
10   10  68
11   11  69
12   12  70
13   13  75
14   14  76
15   15  82
16   16  85
17   17  90
18   18 100
19   19 109
20   20 150
21   21 161
22   22 178
23   23 181
24   24 179
25   25 180
26   26 201
27   27 201

所需的输出将是

    val  weigh label
1     1  20    45
2     2  25    45
3     3  37    45
4     4  38    45
5     5  50    45
6     6  52    45
7     7  56    45
8     8  59    45
9     9  64    45
10   10  68    45
11   11  69    45
12   12  70    45
13   13  75    95
14   14  76    95
15   15  82    95
16   16  85    95
17   17  90    95
18   18 100    95
19   19 109    95
20   20 150    145
21   21 161    145
22   22 178    195
23   23 181    195
24   24 179    195
25   25 180    195
26   26 201    195
27   27 201    195

此处45的计算公式为20+(20 + 50)/ 2 = 45,其中20是开始的位置,而20 + 50 = 70是该组需要停止的位置。标签是介于20和70之间的中间数字,即45。

与其他标签类似

 70+(70+50)/2= 95
 120 + (170)/2= 145
 170 + (220)/2 = 195

我是R的新手,曾尝试在这里查看许多资源,但找不到任何可以做这样的事情。我能找到的最接近的是使用cut2进行这样的分组

df %>% mutate(label = as.numeric(cut2(weigh, g=5))) 

1 个答案:

答案 0 :(得分:3)

library(dplyr)

# create your breaks
breaks = unique(c(seq(min(das$weigh), max(das$weigh)+1, 50), max(das$weigh)+1))

das %>%
  group_by(group = cut(weigh, breaks, right=F)) %>%        # group by intervals
  mutate(group2 = as.numeric(group),                       # use the intervals as a number
         label = (breaks[group2]+breaks[group2]+50)/2) %>% # call the corresponding break value and calculate your label
  ungroup()

# # A tibble: 27 x 5
#     val weigh group   group2 label
#   <int> <dbl> <fct>    <dbl> <dbl>
# 1     1    20 [20,70)      1    45
# 2     2    25 [20,70)      1    45
# 3     3    37 [20,70)      1    45
# 4     4    38 [20,70)      1    45
# 5     5    50 [20,70)      1    45
# 6     6    52 [20,70)      1    45
# 7     7    56 [20,70)      1    45
# 8     8    59 [20,70)      1    45
# 9     9    64 [20,70)      1    45
#10    10    68 [20,70)      1    45
# # ... with 17 more rows

您可以删除任何不必要的列。我将它们留在这里只是为了使您更容易理解该过程的工作原理。