逐行计算

时间:2019-07-05 07:14:35

标签: r

我已经开始学习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中的新行值中。

3 个答案:

答案 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