【发布时间】:2018-06-14 05:53:24
【问题描述】:
我有要分组的数据,执行计算然后得到最终结果,将其用于下一组中的计算。
我们使用条件语句并按组执行计算,例如:
# Example Data
condition <- c(0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0)
col_a <- c(0,0,0,2,3,4,0,0,0,2,4,5,6,0,0,0,0,0,0,0,0,1,2,0)
col_b <- c(0,0,0,10,131,14,0,0,0,22,64,75,96,0,0,0,0,0,0,0,0,41,52,0)
df <- data.frame(condition,col_a,col_b)
这是进行计算的代码,按 RunID 分组
# Group by RunID
# Perform calculations
# Last value, brought forward to next group
require(dplyr)
output <- df %>%
dplyr::mutate(RunID = data.table::rleid(condition)) %>%
group_by(RunID) %>%
dplyr::mutate(calculation = ifelse(condition == 0,0, ifelse(row_number() == n(),first(col_a) * last(col_b),0))) %>%
dplyr::mutate(last.tag = ifelse(condition == 0,0, ifelse(row_number() == n(),2,0))) %>% # 添加助手ID号帮助下面的for循环回答 取消组() %>% 选择(-RunID) 输出
随着输出:
condition col_a col_b calculation
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 1 2 10 0
5 1 3 131 0
6 1 4 14 28
7 0 0 0 0
8 0 0 0 0
9 0 0 0 0
10 1 2 22 0
11 1 4 64 0
12 1 5 75 0
13 1 6 96 192
14 0 0 0 0
15 0 0 0 0
我想做的是。在第一个结果中,计算列中的结果是 28。我想将该值带到下一组并插入 col_a,行号 10(28 替换,2)。然后随着该值的更新。第二组计算结果将是 96 * 28 = 2688 与 (96*2 = 192)
如上例所示,结转将始终插入每个组的第一行。
预期输出:
condition col_a col_b calculation
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 1 2 10 0
5 1 3 131 0
6 1 4 14 28
7 0 0 0 0
8 0 0 0 0
9 0 0 0 0
10 1 28 22 0
11 1 4 64 0
12 1 5 75 0
13 1 6 96 2688
14 0 0 0 0
15 0 0 0 0
其他解决方案:
我进行了子集化以删除所有 0,s。在每个组的底部添加一个标识的 2 数字以进行连续运行,然后使用 for 循环进行抓取和替换。可能不是最优雅但似乎有效:
# Subset to remove all 0
subset.no.zero <- subset(output,condition >0)
# Loop to move values
for (i in 1:nrow(subset.no.zero)) {
temp <- ifelse(subset.no.zero$last.tag[i-1] == 2, subset.no.zero$calculation[i-1],subset.no.zero$col_a[i])
subset.no.zero$new_col_a[i] <- data.frame(temp)
}
# Re join by index no.
final_out <- full_join(output,subset.no.zero, by="index")
【问题讨论】:
-
你能显示你的预期输出吗?
-
你是怎么得到
28的?当我运行您的代码时,我得到 20(行号:6)和 44(行号:13) -
我不确定,我重新运行并得到与示例相同的结果。该语句正在执行:first(col_a) * last(col_b) 那么这应该是怎么回事?
-
哦..你有一个错误。你有
first(col_a) * first(col_b)而不是 ... * last()... -
哎呀。让我解决!