在dplyr vs data.table中按操作对_分组,以便快速实施 dat% dplyr::分组依据(yearID,索引名称)%>% dplyr::summary(p.start.val=sum(value[monthID==p.start]), p、 val=sum(值[monthID>=p.start&monthID=m.start&monthID=h.start&monthID% tidyr::聚集(、变量、值、p.start.val:h.end.val)%>% dplyr::mutate(new.col.name=paste0(索引名称,变量))%>% dplyr::select(-index_name,-变量)%%>% tidyr::价差(,新列名称,值)%>% dplyr::突变(yearRef=2018) colnames(df1)% dplyr::筛选器(索引名称%c('x4','x6'))%>% dplyr::分组依据(yearID,索引名称)%>% dplyr::summary(p.end.val=value[monthID==p.end], m、 end.val=value[monthID==m.end], h、 end.val=value[monthID==h.end])%>% tidyr::聚集(,变量,值,p.end.val:h.end.val)%>% dplyr::mutate(new.col.name=paste0(索引名称,变量))%>% dplyr::select(-index_name,-变量)%%>% tidyr::价差(,新列名称,值)%>% dplyr::突变(yearRef=2018) colnames(df2)
我将只在在dplyr vs data.table中按操作对_分组,以便快速实施 dat% dplyr::分组依据(yearID,索引名称)%>% dplyr::summary(p.start.val=sum(value[monthID==p.start]), p、 val=sum(值[monthID>=p.start&monthID=m.start&monthID=h.start&monthID% tidyr::聚集(、变量、值、p.start.val:h.end.val)%>% dplyr::mutate(new.col.name=paste0(索引名称,变量))%>% dplyr::select(-index_name,-变量)%%>% tidyr::价差(,新列名称,值)%>% dplyr::突变(yearRef=2018) colnames(df1)% dplyr::筛选器(索引名称%c('x4','x6'))%>% dplyr::分组依据(yearID,索引名称)%>% dplyr::summary(p.end.val=value[monthID==p.end], m、 end.val=value[monthID==m.end], h、 end.val=value[monthID==h.end])%>% tidyr::聚集(,变量,值,p.end.val:h.end.val)%>% dplyr::mutate(new.col.name=paste0(索引名称,变量))%>% dplyr::select(-index_name,-变量)%%>% tidyr::价差(,新列名称,值)%>% dplyr::突变(yearRef=2018) colnames(df2),r,dplyr,data.table,R,Dplyr,Data.table,我将只在df1上运行这个,因为从那里可以很容易地重复模式 注: 我使用magrittr仅仅是为了帮助分解链中的每一步,因为dplyr的*动词都是可直接翻译的。将其转换为非magrittr`管道并不困难。使用它的好处(tidyverse管道也是如此)在我看来,是可读性,因此是可维护性 答案 我将走过下面的步骤 库(data.table) 图书馆(magrittr) as.数据表(dat)%>% melt(,measure.vars=grep(^x[0-9]+),colnames(.), var
df1
上运行这个,因为从那里可以很容易地重复模式
注:
- 我使用
仅仅是为了帮助分解链中的每一步,因为magrittr
的*动词dplyr
都是可直接翻译的。将其转换为非
magrittr`管道并不困难。使用它的好处(tidyverse管道也是如此)在我看来,是可读性,因此是可维护性
库(data.table)
图书馆(magrittr)
as.数据表(dat)%>%
melt(,measure.vars=grep(^x[0-9]+),colnames(.),
variable.name=“index_name”,variable.factor=FALSE)%>%
[!索引名称%在%c(“x5”、“x6”),]%>%
.[, .(
p、 start.val=sum(值[monthID==p.start]),
p、 val=sum(值[monthID>=p.start&monthID=m.start&monthID=h.start&monthID%
熔体(,id.vars=1:2,variable.factor=FALSE)%>%
[,new.col.name:=paste0(索引名称,“,”变量)]%>%
[,c(“索引名称”,“变量”):=NULL]]>%
dcast(,yearID~新列名称)%%>%
[,yearRef:=2018]
步骤: 步骤说明:
- 在演练中,我将
和dplyr::arrange_all()
添加到每个中间管道的末端,以便进行苹果对苹果的比较[order(.),]
- 您的示例中没有包含随机种子。我使用了
,因此要将您的控制台与我显示的进行比较,您需要设置此种子并重新生成set.seed(42)
dat
- 每个代码块都从上一步的代码继续,为了简洁起见,我将所有重复的代码缩短为
,以使这个答案不那么冗长..%>%
tidyr::gather
到data.table::melt
。可能有比grep
更好的方法来选择数据中的列范围。table::melt
,但是当as.data.table(dat)[,-(x1:x6)]
工作时,相同的列范围在melt
中不起作用
dat%>%
tidyr::聚集(,索引名称,值,x1:x6)%>%
排列_all()%>%head()#只是为了比较
##tibble:6 x 10
#yearID monthID p.start p.end m.start m.end h.start h.end index_name值
#
#11678891011x11.37
#21167891011x2-0.483
#311678891011x3-0.314
#41167881011X4-2.23
#511677891011x5-0.717
#611677891011x6-1.04
as.数据表(dat)%>%
melt(,measure.vars=grep(^x[0-9]+),colnames(.),
variable.name=“index_name”,variable.factor=FALSE)%>%
[顺序(.),]%>%head()#仅供比较
#yearID monthID p.start p.end m.start m.end h.start h.end index_name值
#1:11167891011x11.3709584
#2:11167891011x2-0.4831687
#3:11167891011x3-0.3139498
#4:11167881011X4-2.2323282
#5:11167881011X5-0.7167575
#6:11167881011x6-1.0357630
dplyr::filter
和dplyr::summary
(分组);我只是将新变量的赋值从summary(…)
复制到(…)
块中,无需更改
…%>%
dplyr::筛选器(!索引_名称%in%c('x5','x6'))%>%
dplyr::分组依据(yearID,索引名称)%>%
dplyr::summary(p.start.val=sum(value[monthID==p.start]),
p、 val=sum(值[monthID>=p.start&monthID=m.start&monthID=h.start&monthID%
排列_all()%>%head()#只是为了比较
##tibble:6 x 7
##组:yearID[2]
#yearID索引\名称p.start.val p.val m.val h.val h.end.val
#
#1 x1-0.106 1.41 1.92 1.24 1.30
#21x20.573-0.516-2.29-3.54-0.990
#3 1 x3 0.767 0.455 0.461 2.28 2.08
#4 1 x4-0.0559-1.11-0.0975-0.326-0.483
#5.2 x1-2.66-5.10 1.01-1.95-0.172
#6 2 x2 0.342-0.546 0.605 1.51 1.25
... %>%
[!索引名称%在%c(“x5”、“x6”),]%>%
.[, .(
dat <- data.frame(yearID = rep(1:10000, each = 12),
monthID = rep(1:12, times = 10000),
x1 = rnorm(120000),
x2 = rnorm(120000),
x3 = rnorm(120000),
x4 = rnorm(120000),
x5 = rnorm(120000),
x6 = rnorm(120000),
p.start = 6,
p.end = 7,
m.start = 8,
m.end = 9,
h.start = 10,
h.end = 11)
library(dplyr)
start_time <- Sys.time()
df1 <- dat %>%
tidyr::gather(., index_name, value, x1:x6) %>%
dplyr::filter(!index_name %in% c('x5','x6')) %>%
dplyr::group_by(yearID, index_name) %>%
dplyr::summarise(p.start.val = sum(value[monthID == p.start]),
p.val = sum(value[monthID >= p.start & monthID <= p.end]),
m.val = sum(value[monthID >= m.start & monthID <= m.end]),
h.val = sum(value[monthID >= h.start & monthID <= h.end]),
h.end.val = sum(value[monthID == h.end])) %>%
tidyr::gather(., variable, value, p.start.val:h.end.val) %>%
dplyr::mutate(new.col.name = paste0(index_name,'_',variable)) %>%
dplyr::select(-index_name, -variable) %>%
tidyr::spread(., new.col.name, value) %>%
dplyr::mutate(yearRef = 2018)
colnames(df1) <- sub(".val", "", colnames(df1))
df2 <- dat %>%
tidyr::gather(., index_name, value, x1:x6) %>%
dplyr::filter(index_name %in% c('x4','x6')) %>%
dplyr::group_by(yearID, index_name) %>%
dplyr::summarise(p.end.val = value[monthID == p.end],
m.end.val = value[monthID == m.end],
h.end.val = value[monthID == h.end]) %>%
tidyr::gather(., variable, value, p.end.val:h.end.val) %>%
dplyr::mutate(new.col.name = paste0(index_name,'_',variable)) %>%
dplyr::select(-index_name, -variable) %>%
tidyr::spread(., new.col.name, value) %>%
dplyr::mutate(yearRef = 2018)
colnames(df2) <- sub(".val", "", colnames(df2))
final.dat <- Reduce(function(...) merge(..., by = c( "yearID", "yearRef"), all.x=TRUE), list(df1,df2))
end_time <- Sys.time()
end_time - start_time
# Time difference of 2.054761 secs