将函数应用于 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 个月,因为我想在其原始的 1 月至 12 月框架中总结一些变量。
感谢任何帮助!干杯
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)
使用data.table
,我们shift
将'year'乘以6,将其用作分组变量,并得到'x'[=14的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
我是 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 个月,因为我想在其原始的 1 月至 12 月框架中总结一些变量。
感谢任何帮助!干杯
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)
使用data.table
,我们shift
将'year'乘以6,将其用作分组变量,并得到'x'[=14的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