【问题标题】:Cross Join in dplyr in R在 R 中的 dplyr 中交叉加入
【发布时间】:2016-05-26 04:42:16
【问题描述】:
library(dplyr)
cust_time<-data.frame(cid=c("c1","c2","c3","c4","c5"),ts=c(2,7,11,13,17))
#I want to do a cross join on self, preferable in dplyr else base package is Ok
#But w/o renaming header names
#Currently I have to create a duplicate cust_time to do this.
cust_time.1<-rename(cust_time,cid1=cid,ts1=ts)
merge(cust_time,cust_time.1,by=NULL)

#Later I will want to do cross join within the grouped region
cust_time <-mutate(cust_time,ts.bucket=ts%/%10)
#If using duplicate tables, not sure, how to do the below
#group_by(cust_time,ts.bucket) %>%
#do cross join within this bucket

基本上,我想在表上进行交叉自连接,但由于我无法使用 dplyr 解决方案,所以我使用了基本包。但这需要我重命名所有列。但是,我后来希望能够在分组级别进行交叉连接,这就是我遇到的问题。
任何帮助表示赞赏。

【问题讨论】:

  • cust_time中没有ts.bucket
  • 你可以试试do.call(data.table::CJ, cust_time)
  • @DavidArenburg,这只是expand.grid(cust_time),不是吗?
  • @docendodiscimus 是的,但速度快了无数倍......或者tidyr::complete(cust_time, cid, ts),如果我们已经进入它的话......
  • @DavidArenburg,我知道。我的意思是,它与 OP 用他的merge 创建的输出不对应

标签: r dplyr


【解决方案1】:

dplyr 1.0 版开始,您可以通过指定by = character() 进行交叉连接:

cust_time %>% full_join(cust_time, by = character())

【讨论】:

    【解决方案2】:

    这是一个完全兼容dplyr 的解决方案。它与态度凳的解决方案有许多相同的想法,但优点是只有一条线。

    require(magrittr)  # for the %<>% operator
    
    # one line:
    (cust_time %<>% mutate(foo = 1)) %>% 
            full_join(cust_time, by = 'foo') %>% 
            select(-foo)
    

    【讨论】:

    • 不修改原始数据:cust_time %&gt;% mutate(foo=1) %&gt;% full_join(.,., by="foo") %&gt;% select(-foo)
    【解决方案3】:

    您只需要一个虚拟列即可加入:

    cust_time$k <- 1
    cust_time %>% 
      inner_join(cust_time, by='k') %>%
      select(-k)
    

    或者如果您不想修改原始数据框:

    cust_time %>%
      mutate(k = 1) %>%
      replicate(2, ., simplify=FALSE) %>%
      Reduce(function(a, b) inner_join(a, b, by='k'), .) %>%
      select(-k)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 2020-12-12
      • 1970-01-01
      • 2014-08-10
      • 2012-01-13
      • 2013-03-11
      • 1970-01-01
      • 2018-10-07
      相关资源
      最近更新 更多