【问题标题】:R: find all observations from data.table with values from another data.tableR:从另一个 data.table 中查找 data.table 中的所有观察值
【发布时间】:2014-04-19 10:47:39
【问题描述】:

我在 R 中有两个数据表:DT1 有 5 个变量的大约 30K 观测值:userIDuserNameproductIDproductNameusersRateDT2 只有 500 个观测值2 个变量:productIDsimilarProductID。我想从DT1 中找到所有行,其中productID 与DT2 中的similarProductID 相同。我试过DT1[which(DT1$productID==DT2$similarProductID)]DT1[which(DT1$productID==intersect(DT1$productID,DT2$similarProductID))] 但没有成功,我收到的意见太少。有什么想法我该怎么做?

【问题讨论】:

  • 一如既往,我们需要一个可重现的示例。但看起来你应该加入。

标签: r data.table


【解决方案1】:

最快的方法是加入:

#mock data
DT1<-data.table(userID=1:30000,userName=sample(LETTERS,30000,T),productID=30001:60000,productName=sample(LETTERS,30000,T),userRate=runif(30000))
DT2<-data.table(productID=1:500,similarProductId=sample(30001:60000,500))

#set keys
setkey(DT1,productID)
setkey(DT2,similarProductId)

#join
DT1[DT2]

   productID userID userName productName   userRate productID.1
1:     30014     14        L           R 0.87649196         473
2:     30025     25        E           A 0.02237395         326
3:     30027     27        H           Z 0.43986360         198
4:     30065     65        V           K 0.33047666         240
5:     30123    123        R           X 0.38637559         210
---                                                             
  496:     59575  29575        U           A 0.41036652         214
497:     59665  29665        C           E 0.67345907          45
498:     59724  29724        F           Y 0.18853101          81
499:     59764  29764        D           X 0.50271854         386
500:     59790  29790        Z           A 0.02222698         397

【讨论】:

  • 我通过连接获得DT1 中的NA 值,如果对象具有不同的类型,是否会出现问题?同样userIDproductID 的值在DT1 中不是唯一的,DT1 中的每一行都由userIDproductID 唯一定义。我需要得到DT1$productID==DT2$similarProductID的所有行。
  • DT1[which(DT1$productID==x)] 非常适合来自DT2$similarProductID 的特定x,但是当我想要所有可能的DT2$similarProductID 时,它就不能以正确的方式工作。我的目标是找到所有评价过类似产品的用户。
  • @v_toria,尝试使用nomatch=0L 参数。 NA 表示DT1 中的DT2 中的key 的值不匹配。所以试试DT1[DT2, nomatch=0L。这只会提供那些在DT2 中的密钥也在DT1 中找到的那些。 HTH。
  • 嗨@v_toria - 是的DT1[DT2, nomatch=0L] 示例应该可以工作
  • 谢谢@Arun,现在它的锅好多了,但结果仍然不能接受。我知道length(intersect(DT1$productID,DT2$similarProductID)) 等于223,所以DT1[DT2, nomatch=0L] 应该返回包含223 个不同productIDs 的data.table,但是我得到的子集只有63 个观察值,并且唯一productIDs 的数量是2 而不是223。我不明白为什么会这样,谁能解释一下?
【解决方案2】:

我怀疑这种方式会比 Troy 的 join 答案更快,但您可以使用 R 中的合并功能。

  DT1<-data.frame(userID=1:30000,userName=sample(LETTERS,30000,T),productID=30001:60000,productName=sample(LETTERS,30000,T),userRate=runif(30000))
  DT2<-data.frame(productID=sample(30001:60000,500), similarproductID=sample(30001:60000,500))

  colnames(DT2)<-c("BadproductID","productID") #Do this to match the colname in DT1

  DTMerged<-merge(DT1,DT2, by="productID") #Should give you all your matches without NA's

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多