【问题标题】:compare two data.tables by row and add new column按行比较两个data.tables并添加新列
【发布时间】:2019-07-24 06:54:09
【问题描述】:

我有两个 data.tables 我想对每一行进行比较并添加新列。

DT1 <- data.table(ID=c("F","A","E","B","C","D","C"),
                  num=c(59,3,108,11,22,54,241),
                  value=c(90,47,189,72,42,86,280))

DT2 <- data.table(Mark=c("Mary","Abner","Bonnie","Trista","Norman"),
                  numA=c(48,20,88,237,10),
                  numB=c(60,326,54,268,89),
                  valueA=c(78,34,78,270,60),
                  valueB=c(92,190,90,385,75))

我的目标:

我想在DT1中找到num和value,DT2中有numA和numB的范围。

例如:

对于 DT1 中的 F 行 num = 59 和 value = 90,也必须匹配:

num(59) > DT2$numA(48) & num(59) DT2$valueA(78) & value(90)

匹配!所以添加新的列名结果,值为Mark by dt2

如果没有匹配,设置为未定义

想要的结果:

DT3 <- data.table(ID=c("F","A","E","B","C","D","C"),
              num=c(59,3,108,11,22,54,241),
              value=c(90,47,189,38,42,86,280),
              result=c("Mary","Undefined","Abner","Norman",
                       "Abner","Abner","Trista"))

如何保证每一行都有比较并添加新列?

【问题讨论】:

  • 如何解决冲突?当有不止一场比赛时,你会选择哪一场?目前,我正在参加第一场比赛。
  • 我也想过这个问题,但是对于我的原始数据来说,好像没问题,只要能找到对应的资料就可以了。

标签: r data.table


【解决方案1】:

data.table 选项:

DT1[DT2, on=.(num > numA, num < numB, value > valueA, value < valueB), Mark := i.Mark]

 DT1
   ID num value   Mark
1:  F  59    90  Abner
2:  A   3    47   <NA>
3:  E 108   189  Abner
4:  B  11    72 Norman
5:  C  22    42  Abner
6:  D  54    86  Abner
7:  C 241   280 Trista

【讨论】:

  • 谢谢,我试过用:=,但是没有成功,你的方法可以,我得重新研究data.table。
【解决方案2】:

我确信使用data.table 中的一种连接操作可以更有效地解决这个问题,但是,这里有一个使用mapply 的基本 R 选项

DT1$result <- mapply(function(x, y) {
   inds <- x > DT2$numA & x < DT2$numB & y > DT2$valueA & x < DT2$valueB
   if(any(inds))
     DT2$Mark[which.max(inds)]
   else "Undefined"
}, DT1$num, DT1$value)


DT1
#   ID num value    result
#1:  F  59    90      Mary
#2:  A   3    47 Undefined
#3:  E 108   189     Abner
#4:  B  11    72    Norman
#5:  C  22    42     Abner
#6:  D  54    86      Mary
#7:  C 241   280    Trista

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多