【问题标题】:Given a criterion in one vector and a value in 2nd vector, find the closest value in 3rd vector but report the corresponding value in 4th vector给定一个向量中的标准和第二个向量中的值,在第三个向量中找到最接近的值,但在第四个向量中报告相应的值
【发布时间】:2020-05-13 01:04:40
【问题描述】:

我有两个数据框。

dfx <- data.frame(ID=c("A", "A", "A", "B", "B", "B", "B", "B", "B"), 
                 a=c( 0.1, 2.1, 1.5, 1.8, 8, 1, 1.4, 39, 100))

  ID     a
1  A   0.1
2  A   2.1
3  A   1.5
4  B   1.8
5  B   8.0
6  B   1.0
7  B   1.4
8  B  39.0
9  B 100.0

dfy<-data.frame(ID=c("A", "A", "A", "B", "B", "C", "C", "D"),
                aa=c(0.5, 1, 2, 5, 10, 20, 40, 80),
                bb=c(1, -1, 20, -5, 10, 20, 40, 80))

  ID   aa bb
1  A  0.5  1
2  A  1.0 -1
3  A  2.0 20
4  B  5.0 -5
5  B 10.0 10
6  C 20.0 20
7  C 40.0 40
8  D 80.0 80



我正在寻找一种在 dfx 中创建新变量的方法,使用每行中的 ID 和“a”中的值来查找特定于 ID 的“bb”,使用“aa”相对中的最接近值为“一”。例如, 对于第一行,返回的答案将为 1(“aa”中最接近 a = 0.1 的“A”值是 0.5,对应于 bb = 1)。第二行的答案是 20。

我已经看到很多关于 sapply 和 which.min 的示例,但是我找不到任何可以帮助我解决此类问题的内容。有什么建议吗?

【问题讨论】:

    标签: indexing match lookup sapply closest


    【解决方案1】:

    我找到了解决办法

    library(data.table)
    
    dtx<-as.data.table(dfx)
    dty<-as.data.table(dfy)
    setkeyv(dtx,c("ID","a"))
    setkeyv(dty,c("ID","aa"))
    dtx$ID<-as.character(dtx$ID)
    dtx$a<-as.double(dtx$a)
    dty$ID<-as.character(dty$ID)
    dty$aa<-as.double(dty$aa)
    newtable<-dty[dtx,on=c(ID="ID",aa="a"),roll="nearest"]
    names(newtable)[names(newtable)=="aa"]<-"a"
    
      ID     a bb
    1:  A   0.1  1
    2:  A   1.5 -1
    3:  A   2.1 20
    4:  B   1.0 -5
    5:  B   1.4 -5
    6:  B   1.8 -5
    7:  B   8.0 10
    8:  B  39.0 10
    9:  B 100.0 10
    

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2015-06-30
      相关资源
      最近更新 更多