2016-07-13 10 views
0

我有一個data.table,其中有幾個客戶,一些日期值和pay_day值。 pay_day是爲每個客戶長度爲5的一個矢量,它由天數值的如何知道列的值是否是R data.table中另一列值的一部分

我想用pay_day矢量一天是否是pay_day

這裏的一部分,以檢查每天值爲僞數據這個(赦免凌亂的方式來創建數據)也想不出更好的辦法ATM

customers <- c("179288" ,"146506" ,"202287","16207","152979","14421","41395","199103","183467","151902") 
mdays <- 1:31 
set.seed(1) 
data <- sort(rep(customers,100)) 
days <- sample(mdays,1000,replace=T) 

xyz <- cbind(data,days) 
x <- vector(length=1000L) 
j <- 1 
for(i in 1:10){ 

    set.seed(i) ## I wanted diff dates to be picked 
    m <- sample(mdays,5) 


    while(j <=100*i){ 
    x[j] <- paste(m,collapse = ",") 
    j <- j+1 
    } 
} 

xyz <- cbind(xyz,x) 
require(data.table) 
my_data <- setDT(as.data.frame(xyz)) 

setnames(my_data, c("cust","days","pay_days")) 
my_data[,pay:=runif(1000,min = 0,max=10000)] 

現在我想每個cust這發生在pay_dayspays的載體。

我嘗試了各種方法,但不能似乎算起來,我最初的想法是創建一個基於一個標誌,如果天pay_days的一個子集,然後採取支付根據標誌 my_data[,ifelse(grepl(days,pay_days),1,0),cust]

這樣做沒有按照我的預期工作。我不想使用本地迴路作爲

實際數據是巨大的。

+1

'錯誤以x [j]的< - 糊(米,塌陷= 「」):對象 'X' 不found' – Deena

+0

糟糕一個我忘了添加'x' – Bg1850

回答

1

使用tidyr分裂pay_days列進再檢查,如果天是pay_days:

library(tidyr) 
library(dplyr) 

# creating long-form data 
tidier <- my_data %>% 
    mutate(pay_days = strsplit(as.character(pay_days), ",")) %>% 
    unnest(pay_days) 

# casting as numeric to make factor & character columns comparable 
tidier[, days := as.numeric(days)] 
tidier[, pay_days := as.numeric(pay_days)] 

tidier[days == pay_days, pay, by=cust] 

不知道如何進行大數據,因爲你的天在pay_days數乘以你的表長度正如Dee也指出的那樣:

備註:我還不能評論,但要複製您的數據,需要添加library(data.table)並初始化x x<-vector(),否則找不到該數據。

0

使用所述數據表中的另一個的一襯墊的方法:

my_data[,result:=sum(unlist(lapply(strsplit(as.character(pay_days),","),match,days)),na.rm=T)>0,by=1:nrow(my_data)] 
相關問題