Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在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 - Fatal编程技术网

在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