2013-03-30 32 views
0

我正在尋找一種更有效的方式來創建子集R.使用數據集where rows = products和columns = time,我想查找那些在第1周開始銷售產品的行(產品),然後將其作爲子集。然後對第2周做同樣的事情。條件子集的基礎上求和相鄰列在R(plyr包?)

set.seed(4); d <- data.frame(
product = seq(1:10), 
week1= sample(0:1,10,replace=TRUE), 
week2= sample(0:3,10,replace=TRUE), 
week3=sample(0:5,10,replace=TRUE), 
week4= sample(0:5,10,replace=TRUE),speed=sample(100:200,10),quality=sample(20:50,10) 
) 

完整的數據幀是d。所以我需要知道2件事情才能找到所有的子集: 1)以前的所有銷售週期都是== 0,然後是 2)本週的銷售額不是零。

沒有子集應該重疊,因爲他們在第一次進入市場時將產品分組。

我發現一個窮人的方式來做到這一點,但我知道必須有更好的方法!

低效的方式:

subset3<-d[d$week3 >0 & d$week2==0 & d$week1==0 ,] 
subset4<-d[d$week4 >0 & d$week3 ==0 & d$week2==0 & d$week1==0,] 

會更有效,但仍差

subset3<-d[d$week3 >0 & d$week2+d$week1==0 ,] 
subset4<-d[d$week4 >0 & d$week3 + d$week2 + d$week1==0,] 

這種感覺就像我應該可以做這樣的事情,但它不工作:

subset4<-d[d$week4 >0 & sum(d$week1:d$week3) ==0, ] 

我不認爲ddply或申請會在這裏工作,但也許我錯了? 我需要的結果是d的子集,所有列,就像這樣:

subset3 =

product week1 week2 week3 week4 speed quality 
    2  0  0  5  1 124  42 
    3  0  0  3  5 155  45 
+0

什麼?那是什麼編程語言?你在想什麼?請閱讀常見問題解答:http://stackoverflow.com/faq。就目前而言,我非常懷疑我們能夠有效地幫助你。 –

+0

是的,自從用戶在34分鐘前將其編輯到問題中後,我就知道了。 Fwiw我仍然認爲這個問題需要重新表述。 –

+0

對不起,我正在嘗試閱讀常見問題解答並使其更易於理解。我現在發佈了可以幫助的可重複數據。我感謝你的耐心! – user2205744

回答

0

您可以使用類似:

d$weekstart <- apply(d[,-1],1,function(x) which(x>0)[1]) 

這將確定第一個非每個產品的零售周。 然後,您可以使用此列來分割你的數據集中起來,像這樣:

result <- split(d,d$weekstart) 

然後,您可以訪問每一個子集,如:

result[[1]] 

在上面的代碼更改1到你想要的開始一週訪問將類似於有subset1subset2

+0

哇。這很不錯。該對象的'結果'是一個列表,而我正在尋找創建數據框,但我看到這將是多一步。 – user2205744

+0

我相信這是我一直在尋找的最終答案。我怎樣才能關閉這個問題?謝謝! – user2205744

+0

@ user2205744 - 按照您已經完成的方式選擇答案標記即可。很高興我可以提供幫助。 – thelatemail

0

我希望我明白你想要做什麼。這裏嘗試使用rle函數。我爲每一行應用它(每個產品)。

ll <- apply(d,1,function(x){ 
    y <- rle(x) 
    nn <- names(y$lengths[y$values ==0]) 
    vv <- y$lengths[y$values ==0] 
    if(length(nn)==0) 
    res <- data.frame(nbr=0,goodweek='week1') 
    else 
    res <- data.frame(nbr=vv,goodweek=nn) 
}) 


do.call(rbind,ll) 
     nbr goodweek 
week3 2 week3 ## 2 bad weeks with 0 then week3 is good 0 0 value>0 
week31 2 week3 
3  0 week1 
week4 1 week4 
week2 1 week2 
6  0 week1 ## all weeks are good 
week41 1 week4 
8  1   ## the last week is bad! I dont' know what to return here! 
9  0 week1 
week21 1 week2 

這裏我用您的d:

d 
    week1 week2 week3 week4 
1  0  0  5  2 
2  0  0  1  3 
3  1  2  3  2 
4  1  1  0  1 
5  0  3  1  4 
6  1  1  2  4 
7  1  2  0  4 
8  1  3  2  0 
9  1  1  5  4 
10  0  3  2  2