2017-08-23 29 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