我正在建立一个保险数据库,我需要重述日期。我创建了一个循环,但返回结果需要4个小时,这太长了。
现在我尝试用*pply
函数替换循环。任何帮助都会非常感激。
df <- read.table(header=TRUE, text=
"V1 V2 V3
AA 1 4
AB 3 2
AB 2 7
CD 5 1
CC 1 2
CC 9 6")
#Loop
for(i in 2:nrow(df)) {
for(j in 2:ncol(df)) {
if (df[i,1] == df[i-1,1]){
df[i,j] <- df[i,j] + df[i-1,j]
}
}
}
答案 0 :(得分:1)
使用基座R
,您可以执行以下操作:
df[-1] <- lapply(df[-1], function(x) ave(x, df$V1, FUN=cumsum))
以下是data.table
的解决方案:
library("data.table")
setDT(df)
dnew <- df[, lapply(.SD, cumsum), V1]
dnew
# V1 V2 V3
# 1: AA 1 4
# 2: AB 3 2
# 3: AB 5 9
# 4: CD 5 1
# 5: CC 1 2
# 6: CC 10 8
使用的数据:
df <- read.table(header=TRUE,text=
"V1 V2 V3
AA 1 4
AB 3 2
AB 2 7
CD 5 1
CC 1 2
CC 9 6")
使用data.table
您可以更快地使用:
library("data.table")
df <- fread(
"V1 V2 V3
AA 1 4
AB 3 2
AB 2 7
CD 5 1
CC 1 2
CC 9 6")
...这会产生data.table
个对象 - 因此不需要setDT(...)