2017-09-28 13 views
1

내가 고객의 데이터 프레임 말해봐 - 나는 2 개 개의 다른 작업을 수행 할R의 순서

cust_df = 
Date  ArrivalTime TimeInStore  AmountSpent 
170920  930    30    20 
170920  1000   20    20 
170920  1001   30    100 
170920  1500   15    10 
170921  1030   10    200 
170921  1111   25    50 
170921  1900   10    75 

: 1.을 얼마나 많은 시간과 돈을 하루에 3 개 첫 번째 고객 지출 2. 매일 3 명 이내의 무작위 3 고객과 비교하십시오. 해당 일에 3 명 미만의 고객이있는 경우 그 날부터 모든 고객을 포함시키고 싶습니다.

가장 효율적인 방법은 무엇입니까?

cust_df <- cust_df[order(cust_df$Date, cust_df$ArrivalTime),] #order by time 
cust_df_by_Date <- split(cust_df,f = cust_df$Date) #split to dates 
cust_num <- sapply(cust_df_by_Date,function(x) dim(x)[1]) #find num of customers per day 
first_cust_df <- c() 
i <- 1 
for(num in cust_num){ 
    if(num>=3){ 
     first_cust_df <- rbind(first_cust_df,cust_df_by_Date[[i]][1:3,]) 
    } 
    else{ 
     first_cust_df <- rbind(first_cust_df,cust_df_by_Date[[i]][1:num,]) 
    } 
    i <- i+1 
} 

그리고 임의의 부분 :

현재 내 코드는

rand_cust_sampling_df <- ldply(cust_df_by_Date,function(x) x[sample(1:dim(x)[1],ifelse(dim(x)[1]>=3,3,dim(x)[1])),]) 

내가 그렇게 할 수있는 더 효율적인 방법이 있다고 확신 해요,하지만 난 새로운 해요 이 특정 언어에 대한 답변을 찾지 못했습니다.

감사합니다.

답변

3

The dplyr package 여기에서 당신을 도울 수 있습니다.

install.packages("dplyr") 
library(dplyr) 

이 날 처음 3 개 고객을 얻으려면, 다음 slicegroup_by 날짜 : 시간과 지출을 요약 할 수 있지만 예를 들어, 합계 수있는 방법을 질문에서

cust_df %>% 
    group_by(Date) %>% 
    slice(1:3) 

명확하지, 같은 :

cust_df %>% 
    group_by(Date) %>% 
    slice(1:3) %>% 
    summarise(sumSpent = sum(AmountSpent)) 

    Date sumSpent 
    <int> <int> 
1 170920  140 
2 170921  325 

당신은 무작위로 sample_n를 사용하여 날짜별로 3 개 고객을 선택할 수 있습니다

cust_df %>% 
    group_by(Date) %>% 
    sample_n(3) %>% 
    summarise(sumSpent = sum(AmountSpent)) 

    Date sumSpent 
    <int> <int> 
1 170920  130 
2 170921  325