Попробуйте это. Я добавил вспомогательную функцию для вычисления myrate
. Вместо проверки имен я просто делю df на Name
, выполняю вычисления для каждого Name
и в конце связываю их вместе.
# Example data
df <- data.frame(
Name = c(rep("kkk", 3), rep("sss", 3), rep("ttt", 2)),
Amt = c(20:27),
Rupee = c(11, 333, 65, 90, 36, 71, 69, 32)
)
df
#> Name Amt Rupee
#> 1 kkk 20 11
#> 2 kkk 21 333
#> 3 kkk 22 65
#> 4 sss 23 90
#> 5 sss 24 36
#> 6 sss 25 71
#> 7 ttt 26 69
#> 8 ttt 27 32
# Helper function
myrate <- function(df) {
# Init myrate = 0
df$myrate <- 0
# Add id = row number
df$id <- 1
df$id <- cumsum(df$id)
# Loop over id or rows
for (i in df$id) {
df$myrate[i] <-
if (i == 1) {
df$Rupee[i] - df$Amt[i]
} else {
df$myrate[i] <- df$myrate[i - 1] - df$Rupee[i]
}
}
df["id"] <- NULL
df
}
# Computation
library(dplyr)
df %>%
# Split by Name
split(.$Name) %>%
# Compute myrate for each Name
lapply(myrate) %>%
# Bind back in one df
bind_rows()
#> Name Amt Rupee myrate
#> 1 kkk 20 11 -9
#> 2 kkk 21 333 -342
#> 3 kkk 22 65 -407
#> 4 sss 23 90 67
#> 5 sss 24 36 31
#> 6 sss 25 71 -40
#> 7 ttt 26 69 43
#> 8 ttt 27 32 11
Создано в 2020-04-05 представьте пакет (v0.3.0)