考虑以下数据
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)
使用
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