簡體   English   中英

在 R 中交叉加入 dplyr

[英]Cross Join in dplyr in R

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 解決方案,因此我使用了基數 package。但這需要我重命名所有列。 但是,我后來希望能夠在分組級別進行交叉連接,這就是我絆腳石的地方。
任何幫助表示贊賞。

您只需要一個虛擬列即可加入:

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)

dplyr 1.0 版開始,您可以通過指定by = character()by = character()交叉連接:

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

這是一個完全兼容dplyr的解決方案。 它與attitude_stool 的解決方案有許多相同的想法,但優點是只有一行。

require(magrittr)  # for the %<>% operator

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

使用dplyr 1.1.0 ,您現在可以使用cross_join

cross_join(cust_time, cust_time)

dplyr 1.1.0及更高版本下不推薦使用by = character()

警告消息:在 dplyr 1.1.0 中不推薦使用by = character()來執行交叉連接。 ℹ 請改用cross_join()

暫無
暫無

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

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