Все три решения требуют, чтобы данные были в правильном порядке в каждом Name
. Например, вы можете чередовать имена «A» и «B» (все группы ниже будут обрабатывать это), но годы, вероятно, должны быть неубывающими. 1005 *
set.seed(42)
df1$Ch1 <- c(sort(sample(20, size=4)), sort(sample(20, size=2)))
База R
df1 <- df1[order(df1$Name, df1$Year),]
df1$Bil <- ave(df1$Ch1, df1$Name, df1$Origin,
FUN=function(z) 100 * c(0, diff(z) / head(z, n = -1)))
df1
# Name Year Ch1 Origin Bil
# 1 A 1995 6 a 0.000000
# 2 A 1996 15 b 0.000000
# 3 A 1997 18 a 200.000000
# 4 A 2000 19 a 5.555556
# 5 B 1997 10 c 0.000000
# 6 B 1998 13 c 30.000000
dplyr
library(dplyr)
df1 %>%
arrange(Name, Year) %>%
group_by(Name, Origin) %>%
mutate(
Bil = 100 * c(0, diff(Ch1) / head(Ch1, n = -1))
) %>%
ungroup()
data.table
library(data.table)
library(magrittr)
df1DT <- as.data.table(df1)
setorder(df1DT, Name, Year)
df1DT[, Bil := 100 * c(0, diff(Ch1) / head(Ch1, n = -1)), by = .(Name, Origin)]