折叠选择的组

时间:2019-05-10 14:48:26

标签: r performance

我正在尝试找到一种更快的方法来迭代折叠数据框中的选定组。我目前正在遍历获取,日期和变量。如果可能的话,我想将其向量化。

给出一组ID [1,2],我想获取ID 2的所有值,并将其添加到ID1。此外,此后我想从数据集中删除id2。

生成要调整的数据

dates <- c("Q1", "Q2", "Q3", "Q4")
ids <- c(1,2,3,4)
x1 <- seq(from=1, by=1, length=16)
x2 <- seq(from=1, by=2, length=16)
dat <- expand.grid(dates=dates, ids=ids)
dat <- data.frame(dat, x1, x2)

生成数据以进行调整

ref <- data.frame(acquirer=c(2,3), acquired=c(1,4))

慢速三重迭代折叠

for(i in 1:nrow(ref)){
  for(j in c("x1", "x2")){
    for(z in c("Q1", "Q2", "Q3", "Q4")){
      dat[dat$ids==ref$acquirer[i] & dat$dates==z, j] <- 
          dat[dat$ids==ref$acquirer[i] & dat$dates==z, j] +
          dat[dat$ids==ref$acquired[i] & dat$dates==z, j]
      dat[dat$ids==ref$acquired[i] & dat$dates==z, j] <- NA
    }
  }
}

2 个答案:

答案 0 :(得分:0)

这对于将2压缩为1的情况应该有效:

library(dplyr)
dat %>% 
  mutate(ids = if_else(ids == 2, 1, ids)) %>% 
  group_by(ids, dates) %>% 
  summarize(x1 = sum(x1), x2 = sum(x2))

如果有多个重新编码,则可以添加另一个变异或使用case_when调用。

答案 1 :(得分:0)

使用data.table软件包的方法:

library(data.table)
setDT(dat)
setDT(ref)

#join the acquirer and acquired into a data.table and calculate x1 and x2 values
acqDat <- dat[dat[ref, on=.(ids=acquirer), allow.cartesian=TRUE],
    on=.(dates, ids=acquired), allow.cartesian=TRUE,
    .(dates, ids=i.ids, x1=x1+i.x1, x2=x2+i.x2)]

#update by reference the updated x1 and x2 values
dat[, c("x1", "x2") := acqDat[copy(.SD), on=.(dates, ids), .(x1, x2)]]

输出:

    dates ids x1 x2
 1:    Q1   1 NA NA
 2:    Q2   1 NA NA
 3:    Q3   1 NA NA
 4:    Q4   1 NA NA
 5:    Q1   2  6 10
 6:    Q2   2  8 14
 7:    Q3   2 10 18
 8:    Q4   2 12 22
 9:    Q1   3 22 42
10:    Q2   3 24 46
11:    Q3   3 26 50
12:    Q4   3 28 54
13:    Q1   4 NA NA
14:    Q2   4 NA NA
15:    Q3   4 NA NA
16:    Q4   4 NA NA