簡體   English   中英

將函數應用於data.table中的復雜子集

[英]Apply function to complex subset in data.table

我是data.table ,當我進入真正大數據集的領域時,我想變得更好。

我正在嘗試計算變量x年度均值,但是從Jun(年y -1)到Jun(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個月前的所有內容,因為我想在他們最初的Jan-Dec框架中總結一些變量。

任何幫助表示贊賞! 干杯

使用data.table ,我們shift 'year' 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

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM