2016-02-15 13 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 

Zasadniczo chcę zrobić krzyżowe samołączenie na stole, ale ponieważ nie mam rozwiązania dplyr, użyłem pakietu podstawowego. Wymaga to jednak zmiany nazw wszystkich kolumn. Jednak później chcę mieć możliwość łączenia krzyżowego na poziomie grupowym i tutaj się potykam.
Każda pomoc doceniona.Łączenie krzyżowe w dplyr w R

+0

nie ma '' ts.bucket' w cust_time' – mtoto

+0

Można spróbować 'do.call (data.table :: CJ, cust_time)' –

+0

@DavidArenburg, że po prostu 'expand.grid (cust_time) ", nieprawdaż? –

Odpowiedz

6

Wystarczy kolumnę atrapę do przyłączenia się na:

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

Lub jeśli nie chcesz zmodyfikować oryginalny dataframe:

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

Oto rozwiązanie, które jest całkowicie dplyr -Kompatybilny . Ma wiele takich samych pomysłów, jak rozwiązanie ze stopniem postawy, ale ma tę zaletę, że jest tylko jedną linią.

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

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