如何通过滚动总和来创建组 <20 in r consider the data as 1:10

问题描述 投票:0回答:1

考虑以下数据

data <- data.frame(row=1:10)

   row
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10

这是尝试使用 for 循环的以下代码,

想知道是否可以用map函数代替for循环

# Initialize variables
rolling_sum <- 0
groups <- numeric(0)
current_group <- 1

# Loop through the data
for (i in seq_along(data$row)) {
  # Add the current value to the rolling sum
  rolling_sum <- rolling_sum + data$row[i]
  
  # If the rolling sum exceeds 20, start a new group
  if (rolling_sum > 20) {
    current_group <- current_group + 1
    rolling_sum <- data$row[i]
  }
  
  # Assign the current group to the element
  groups[i] <- current_group
}

# Print data and groups
data_frame <- data.frame(data, groups)
print(data_frame)
r
1个回答
0
投票

使用

Reduce
,如果总和
x
加上新值
y
大于 20,则将总和设置为新值,否则将新值添加到总和中。现在使用
diff
cumsum
查找结果序列下降的位置并每次增加该组。

library(dplyr)
f <- function(x, y) if (x + y > 20) y else x + y
data %>%
  mutate(group = cumsum(c(-1, diff(Reduce(f, row, acc = TRUE))) < 0))
##    row group
## 1    1     1
## 2    2     1
## 3    3     1
## 4    4     1
## 5    5     1
## 6    6     2
## 7    7     2
## 8    8     3
## 9    9     3
## 10  10     4
© www.soinside.com 2019 - 2024. All rights reserved.