r - 使用计算标签从 groupby 创建列

标签 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))) 

最佳答案

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

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

关于r - 使用计算标签从 groupby 创建列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52318757/

相关文章:

r - 在数据框中的分隔符处拆分列

pandas - 如果另一列中的值较差,则汇总一列(不使用 for 循环)

r - 使用 dplyr 链从因子标签中去除尾随空格

r - 如何根据对象索引合并两个列表 - 保持属性?

r - 在 R 的循环中将字符串视为对象名称

r - 因子分层抽样

python-3.x - 在子图中绘制不同的数据帧数据

r - 如何使用dplyr基于字符串选择列

r - 对多列中的值进行排序并创建一个新变量

r - 是否有一个R函数,仅在没有完全匹配时自动从完全匹配切换到部分匹配