【问题标题】:R Mutate and Subset Data on two data tables两个数据表上的 R 变异和子集数据
【发布时间】:2017-08-23 17:24:52
【问题描述】:

我正在尝试获取与每行中的项目编号相似(在整个数据表中)的所有项目的 ECDF,并将 ECDF 列添加到数据表的末尾(EstimatePrediction)。

这适用于单个项目,因此可以一一检查。

    #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

【问题讨论】:

  • 欢迎来到 SO!你能发一个reproducible example吗?
  • 感谢您的回复!我正在尝试获取与每一行中的项目编号相似(在整个数据表中)的所有项目的 ECDF,并将 ECDF 列添加到数据表的末尾(EstimatePrediction)。上面的代码应该适用于上面添加的示例数据集。
  • 请用文字解释你的代码是做什么的。似乎你只需要加入你的桌子,但如果没有解释就很难说。如果您以复制/可粘贴的方式提供示例数据,那也非常好 - 共享代码以创建示例或在示例数据上使用 dput() 来生成此类代码。
  • Matches 表对每个项目编号都有一个索引,并且对所有与该项目相似的项目都有一个匹配索引。我想获取所有类似的物品并获取实际天数的 ECDF

标签: r subset dplyr


【解决方案1】:

看看这是否解决了它:

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)

【讨论】:

  • 谢谢csgroen,但这仍然不能解决问题。基本上我希望能够遍历每一行获取与该行中的项目相似的所有项目,并根据实际天数和估计天数获取该行的 ecdf 并保存该行的 ecdf。
  • 我仍在努力了解您到底需要什么。您想比较每个匹配项目的估计天数和实际天数吗?
  • 对不起 csgroen,我很难解释它。某些项目没有足够的数据来创建 ecdf。我正在使用 KNN 查找彼此相似的项目。每行需要根据所有类似项目的实际天数和该行(或当前项目的)估计天数有自己的 ecdf 输出。
  • 我明白了。那么匹配表是针对 1 项的?
  • 匹配表包含所有匹配数据。每个项目有 50 个匹配项,data.filter 中有大约 200K+ 条记录。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 2015-11-14
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多