我已经开始学习R。
在如何进行循环计算方面需要您的帮助:
C1 C2 C3
A 5 10
A 4 6
B 2 3
B 8 9
我希望输出为
C1 C2 C3 C4(c2*c3)
A 5 10 50
A 4+50=54 6 54*6= 324
B 2 3 6
B 8+6=14 9 14*9 = 126
对于C1列中的每个不同值,应将C4中计算出的值添加到C2中的新行值中。
答案 0 :(得分:6)
一种dplyr
可能是:
df %>%
group_by(C1) %>%
mutate(C4 = (C2 + lag(C2 * C3, default = 0)) * C3,
C2 = C2 + lag(C2 * C3, default = 0))
C1 C2 C3 C4
<chr> <dbl> <int> <dbl>
1 A 5 10 50
2 A 54 6 324
3 B 2 3 6
4 B 14 9 126
或使用data.table
(@ markus提供):
setDT(df)[, `:=`(C4 = (C2 + shift(C2 * C3, fill = 0)) * C3,
C2 = C2 + shift(C4, fill = 0)), by = C1]
答案 1 :(得分:1)
作为循环;-):
d <- read.table(text = "C1 C2 C3
A 5 10
A 4 6
B 2 3
B 8 9", header = TRUE)
my_calc <- function(d) {
d[, 4] <- d[, 2] * d[, 3]
for (i in seq_len(nrow(d) - 1)) {
d[i+1, 2] <- d[i, 4] + d[i+1, 2]
d[i+1, 4] <- d[i+1, 2] * d[i+1, 3]
}
d
}
do.call(rbind, lapply(split(d, d$C1), my_calc))
#C1 C2 C3 V4
#A.1 A 5 10 50
#A.2 A 54 6 324
#B.3 B 2 3 6
#B.4 B 14 9 126
答案 2 :(得分:0)
此循环应该可以解决问题:
df = data.frame(C1=LETTERS[c(1,1,2,2)],C2=c(5,4,2,8),C3=c(10,6,3,9),stringsAsFactors = FALSE)
df$C4=rep(0,nrow(df))
for (i in 1:nrow(df)){
if (i!=1){
if (df$C1[i]==df$C1[i-1]){
df$C2[i]=df$C2[i]+df$C4[i-1]
}
}
df$C4[i] = df$C2[i]*df$C3[i]
}
C1 C2 C3 C4
1 A 5 10 50
2 A 54 6 324
3 B 2 3 6
4 B 14 9 126