用R中的apply函数替换循环* pply

时间:2017-12-08 09:37:15

标签: r

我正在建立一个保险数据库,我需要重述日期。我创建了一个循环,但返回结果需要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]
    }
  }
}

1 个答案:

答案 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(...)