【问题标题】:Apply function to complex subset in data.table将函数应用于 data.table 中的复杂子集
【发布时间】:2016-07-13 18:31:54
【问题描述】:

我是 data.table 的新手,我希望在进入真正的大数据集领域时变得更好。

我正在尝试计算变量 x 的年均值,但从六月(y 年 -1)到六月(y 年)。这很容易使用plyr:

set.seed(9)

dat = data.frame(
  year = rep(2000:2010, each = 12),
  month = 1:12,
  x = runif(12*length(2000:2010))
)

library(plyr)

ldply(unique(dat$year), function(i) 

  if(i == unique(dat$year)[1]) NULL else # in the event going too far back

    data.frame(
      year = i,
      mean.x = mean(c(dat[dat$year == (i - 1) & dat$month == 7:12, "x"], dat[dat$year == i & dat$month == 1:6, "x"]))
    )

)

但我正在努力将语法转换为data.table。我宁愿在不创建中间变量的情况下将所有内容向前移动 6 个月,因为我想在他们最初的 1 月至 12 月框架中总结一些变量。

感谢任何帮助!干杯

【问题讨论】:

    标签: r data.table plyr


    【解决方案1】:

    使用data.table,我们将shift '年'乘以6,将其用作分组变量,并获得'x'的mean

    setDT(dat)[, .(Mean = mean(x)) ,.(year = shift(year, 6)+1)][-c(1L,.N)]
    #  year      Mean
    # 1: 2001 0.5086499
    # 2: 2002 0.5197482
    # 3: 2003 0.6547623
    # 4: 2004 0.5869022
    # 5: 2005 0.4502414
    # 6: 2006 0.5000369
    # 7: 2007 0.4514377
    # 8: 2008 0.4566757
    # 9: 2009 0.3844152
    #10: 2010 0.5635942
    

    【讨论】:

    • 那么shift中的6是指偏移数据的行数?嗯,我喜欢。
    • @jslefche 是的,你是对的。我得到的输出与您使用 ldply 显示的相同
    • 为什么不把-c(1,11)改成-c(1L,.N)?
    • @jangorecki 感谢您的评论
    【解决方案2】:

    Dplyr 提供了一个简单的解决方案。本质上,创建一个相对年份的虚拟变量 - 您要分组的年份 - 然后分组、汇总,并让您的年份列再次具有正确的名称。

    library(dplyr)
    
    
    summaryDat <- dat %>%
    
      #assign relative year for calculation
      mutate(relYear = ifelse(month>6, year+1, year)) %>%
    
      #now group on relative year
      group_by(relYear) %>%
    
      #get your mean
      summarize(mean_x = mean(x)) %>%
    
      #now ungroup
      ungroup() %>%
    
      #format year nicely
      rename(year = relYear)
    

    【讨论】:

    • 请注意,您可以通过直接覆盖 year 的 mutate 语句来使其更紧凑,但是,如果您想对 year 做其他事情,我不想这样做。但它会消除最后的rename 行。
    猜你喜欢
    • 2017-06-18
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2014-08-05
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多