2016-07-13 2 views
0

私は、顧客数が少なく、日々の価値とpay_dayの値があるdata.tableを持っています。 pay_dayは、顧客ごとに長さ5のベクトルであり、それは一日で構成され、私はその日はここpay_dayカラムがR data.tableの別のカラムの値の一部であるかどうかを知る方法

の一部であるためのダミーデータであるかどうかをpay_dayベクターで毎日の値を確認したい

値この(データを作成する厄介な方法のための恩赦は)今、私はpay_daysで起こるpaysの各custベクトルのためにしたい気圧

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)] 

より良い方法を考えることができませんでした。

は、私はさまざまな方法を試してみましたが、カントはそれを把握するように見える、私の最初の考えはフラグこれがない my_data[,ifelse(grepl(days,pay_days),1,0),cust]

に応じて支払う日はpay_daysのサブセットである場合はベースの旗を作成して取ることです私はそれが期待どおりに動作しません。私はネイティブループを使ってはいけません。

実際のデータは膨大です。

+1

'xのエラー[J] < - ペースト(M、崩壊= ""): – Deena

+0

おっとfound'ない 'X' のオブジェクトを私は 'x'を追加するのを忘れた – Bg1850

答えて

1

にpay_days列を分割するtidyrを使用して、その後の日かどうかをチェックするには、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の日数によって、あなたのテーブルの長さを掛けると、大規模なデータのためにどのように実行するかわかりません...

サイドノート:私はまだコメントできませんが、データを複製するには、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)] 
関連する問題