2016-02-15 17 views
5
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 

Về cơ bản, tôi muốn tự mình tham gia chéo bảng nhưng vì tôi không thể dùng giải pháp dplyr, tôi đã sử dụng gói cơ sở. Nhưng nó đòi hỏi tôi phải đổi tên tất cả các cột. Tuy nhiên, sau này tôi muốn có thể tham gia chéo ở cấp độ nhóm và đây là nơi tôi đang vấp ngã.
Bất kỳ trợ giúp nào được đánh giá cao.Tham gia chéo trong dplyr trong R

+0

không có 'ts.bucket' trong 'cust_time' – mtoto

+0

Bạn có thể thử' do.call (data.table :: CJ, cust_time)' –

+0

@DavidArenburg, đó chỉ là 'expand.grid (cust_time) ', phải không? –

Trả lời

6

Bạn chỉ cần một cột giả để tham gia vào:

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

Hoặc nếu bạn không muốn thay đổi dataframe ban đầu của bạn:

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

Dưới đây là một giải pháp đó là hoàn toàn dplyr -tương thích . Nó chia sẻ nhiều ý tưởng giống như giải pháp của thái độ nhưng có lợi thế chỉ là một dòng.

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

# one line: 
(cust_time %<>% mutate(foo = 1)) %>% 
     full_join(cust_time, by = 'foo') %>% 
     select(-foo) 
Các vấn đề liên quan