2017-08-23 62 views
1

我想獲得ECDF的所有項目類似(在整個數據表中)到每行中的項目編號,並將ECDF列添加到數據表的末尾(EstimatePrediction)。R兩個數據表上的變異和子集數據

這適用於單個項目,因此它們可以逐個檢查。

#Set Current ItemNumber 
    currentItemNumber = 「XXXXX」 
    #Set Estimate Days 
    currentEstimate = 5 
    #Gets the index of the ItemNumber from the Matches table 
    itemNoIndex = ((matches%>%subset(Item_No ==itemNumber))$ItemIndex[1]) 
    #Gets all the matching indexs that equal the index and select data 
    matchingItems = matches%>%filter(ItemIndex == itemNoIndex) %>% 
          filter(MatchItemIndex != ItemIndex) %>% 
          merge(data.filter %>% 
          select(ITEM_NO,ACTUAL_DAYS),by = 'ITEM_NO') 
    #Get the ECDF of all matching items at the estimate 
    ecdf(matchingItems $ACTUAL_DAYS)(currentEstimate) 

我想採取上面的R代碼和修改爲整個data.filter數據表工作。問題是它只適用於data.filter數據的第一行。第一行之後的行是基於第一行的數據,而不是它們自己的。

EstimatePrediction = data.filter %>% mutate(PROBABILITY_PREDICTION = ecdf((matches%>%subset(ItemIndex == ((matches%>%subset(Item_No== ITEM_NO))$ItemIndex[1])) %>% 
subset(MatchItemIndex != ItemIndex) %>% 
merge(data.filter, by = 'ITEM_NO'))$ACTUAL_DAYS)(ESTIMATE_DAYS)) 

我對R很新,所以我很樂意提供任何建議。我可以迭代data.filter來獲得正確的輸出,但速度非常慢。

樣本數據

Matches 

MatchItemIndex ItemIndex MatchItemOrder Item_No Count Cumulative 
      <int>  <int>   <int> <chr> <int>  <int> 
1    1   1    1 CBL233J 14   14 
2    2   2    1 CGW112N  4   4 
3    3   3    1 CAT418D  5   5 
4    4   4    1 BRH131T 29   29 
5    5   5    1 CQD390A 17   17 
6    6   6    1 CEE533J 11   11 

    data.filter 

    ITEM_NO ESTIMATE_DAYS ACTUAL_DAYS 
1: CBL233J   10   6 
2: CGW112N   22   12 
3: CAT418D   22   18 
4: BRH131T   33   16 
5: CQD390A   21   15 
6: CEE533J    7   2 

編輯**** 我現在能得到的輸出,我需要它只是很慢:

data.filter = data.filter%>%mutate(Index = 1:n()) 
loopData = data.filter%>%select(ITEM_NO, ACTUAL_DAYS, ESTIMATE_DAYS, Index) 
simpleV = unlist(loopData) 
outputTest = 1:nrow(loopData) 
ptm <- proc.time() 
for(i in 1:nrow(loopData)){ 

    #Get Index for Item Number 
    itemNoIndex = (matches%>%subset(ITEM_NO == simpleV[paste('ITEM_NO',i,sep="")]))$ItemIndex[1] 
    #Find all the matches that have the same index 
    allNNItemData = matches%>%subset(ItemIndex == itemNoIndex) %>% 
    subset(MatchItemIndex != ItemIndex) %>% 
    merge(data.filter, by = 'ITEM_NO') 

    outputTest[i] = ecdf(allNNItemData$ACTUAL_DAYS)(simpleV[paste('ESTIMATE_DAYS',i,sep="")]) 
} 
proc.time() - ptm 
+1

歡迎來到SO!你可以請發佈一個[可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – csgroen

+0

感謝您的回覆!我試圖讓所有項目的ECDF與整個數據表中的項目號相似,並將ECDF列添加到數據表的末尾(EstimatePrediction)。上面的代碼應該與上面添加的示例數據集一起工作。 – JJansen27

+0

也請用您的代碼來解釋您的代碼。似乎也許你只是需要加入你的桌子,但很難說沒有解釋。如果您以複製/粘貼的方式提供樣本數據,那麼它也會非常好,您可以共享代碼以創建樣本,也可以使用樣本數據上的dput()來生成此類代碼。 – Gregor

回答

0

看是否有此解決它:

library(tidyverse) 

#-- Declare objects 
Matches <- tibble(MatchItemIndex = 1:6, ItemIndex = 1:6, 
        MatchItemOrder = rep(1,6), Item_No = c("CBL233J", "CGW112N", 
                 "CAT418D", "BRH131T", 
                 "CQD390A", "CEE533J"), 
        Count = c(14,4,5,29,17,11), Cumulative = c(14,4,5,29,17,11)) 

data.filter <- tibble(ITEM_NO = c("CBL233J", "CGW112N", 
            "CAT418D", "BRH131T", 
            "CQD390A", "CEE533J"), 
         ESTIMATE_DAYS = c(10, 22, 22, 33, 21, 7), 
         ACTUAL_DAYS = c(6, 12, 18, 16, 15, 2)) 

#-- Get matching items by item no 
matchingItems <- intersect(Matches$Item_No, data.filter$ITEM_NO) 

#-- Filter data.filter to matching items 
df <- filter(data.filter, ITEM_NO == matchingItems) 

#-- Do analysis 
ecdf(df$ACTUAL_DAYS)(currentEstimate) 
+0

謝謝csgroen,但這仍然無法解決問題。基本上我希望能夠循環遍歷每一行獲取與該行中的項目相似的所有項目,並基於實際天數和估計日期獲取該行的ecdf並保存該行的ecdf。 – JJansen27

+0

我仍然試圖明白你到底需要什麼。您是否想將每個匹配項目的估算天數與實際天數進行比較? – csgroen

+0

對不起,csgroen,我很難解釋它。有些項目沒有足夠的數據來創建ecdf。我正在使用KNN來查找彼此相似的項目。每一行都需要根據所有類似項目的實際日期和行(或當前項目)的估計日期自行獲得ecdf輸出。 – JJansen27

相關問題