【问题标题】:what is the most efficient way to sum over all observations in previous years什么是总结前几年所有观察的最有效方法
【发布时间】:2019-01-23 12:43:26
【问题描述】:

我有一个类似的数据集如下

对于每个独特的年份,我想总结数据集中每个唯一 ID 拥有的所有条约。解决此类问题的最佳方法是什么?我的数据集比这里的例子大得多。我听说for loops 这样做效率很低。

id <- rep(1:3, 4)
year <- (c(c(rep(1990, 3)), c(rep(1991, 3)), c(rep(1992, 3)), c(rep(1993, 3))) )
treaty <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1 )
data <- cbind(id, year, treaty)

我尝试过的是这样的,但我还没有成功。我也可以使用plyrdplyr 包来执行此操作吗?

for (i in unique(data$year)){
for (j in unique(data$year)){
  prior_temp <- sum(dat$treaty[which(dat$id==j & yearunique[1:i])])
 }
   dat$prior <- prior_temp
}

【问题讨论】:

    标签: r loops dplyr plyr


    【解决方案1】:

    如果 prior 是指 id 的当前年份和之前年份,则:

    transform(data, prior = ave(treaty, id, FUN = cumsum))
    

    或者,如果您真的是指 id 的前几年,那么:

    transform(data, prior = ave(treaty, id, FUN = cumsum) - treaty)
    

    使用 dplyr 可以是这个,或者如果你真的是说之前的话,用 cumsum(treaty) - treaty 替换 cumsum(treaty)

    library(dplyr)
    
    data %>%
      as.data.frame %>%
      group_by(id) %>%
      mutate(prior = cumsum(treaty)) %>%
      ungroup
    

    【讨论】:

    • 哇!那太棒了。是的,这真的意味着years 之前的id。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-01-25
    • 2021-02-10
    • 2019-07-12
    相关资源
    最近更新 更多