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

В принципе, я хочу сделать крест самостоятельно на столе, но так как я не могу использовать решение dplyr, я использовал базовый пакет. Но для этого требуется переименование всех столбцов. Тем не менее, я позже хочу иметь возможность перекрестного соединения на сгруппированном уровне, и именно здесь я спотыкаюсь.
Любая помощь приветствуется.Перейдите Присоединиться к dplyr в R

+0

нет '' ts.bucket' в cust_time' – mtoto

+0

Вы можете попробовать 'do.call (data.table :: CJ, cust_time)' –

+0

@DavidArenburg, что просто 'expand.grid (cust_time) ', не так ли? –

ответ

6

Вам просто нужно фиктивный столбец, чтобы присоединиться на:

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

Или, если вы не хотите, чтобы изменить свой первоначальный dataframe:

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

Вот решение, которое полностью dplyr -Совместим , Он разделяет многие из тех же идей, что и решение orient_stool, но имеет преимущество только в одной строке.

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

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