【问题标题】:Assign a value based on closest neighbour from other data frame根据来自其他数据帧的最近邻居分配一个值
【发布时间】:2016-02-07 08:40:43
【问题描述】:

使用通用数据:

set.seed(456)

a <- sample(0:1,50,replace = T)
b <- rnorm(50,15,5)
df1 <- data.frame(a,b)

c <- seq(0.01,0.99,0.01)
d <- rep(NA, 99)
for (i in 1:99) {
  d[i] <- 0.5*(10*c[i])^2+5
}
df2 <- data.frame(c,d)

对于每个df1$b,我们希望找到最近的df2$d。 然后我们创建一个新变量df1$XYZ,它采用最接近的df2$ddf2$c

这个question 引导我走向data.table 图书馆。但是我不确定ddplyrgroup_by是否也可以使用:

这是我的data.table 尝试:

library(data.table)
dt1 <- data.table( df1 , key = "b" )
dt2 <- data.table( df2 , key = "d" )

dt[ ldt , list( d ) , roll = "nearest" ]

【问题讨论】:

  • 我没有测试过,但可能只是setDT(df1)[df2, XYZ := i.c, on = c(b = "d"), roll = "nearest"]?
  • 阅读this post怎么样?

标签: r data.table dplyr


【解决方案1】:

这是data.table的一种方式:

require(data.table)
setDT(df1)[, XYZ := setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]]

您需要为每个df1$b 获取df2$d 中最接近的值对应的df2$c。所以,我们需要以df2[df1] 的身份加入,这会导致nrow(df1) 行。这可以通过setDT(df2)[df1, c, on=c(d="b"), roll="nearest"] 来完成。

它返回您需要的结果。我们需要做的就是将其添加回df1,名称为XYZ。我们使用:= 来做到这一点。


构造滚动连接的思路是这样的(假设df1df2都是数据表):

  1. 我们需要为df1 的每一行获取一些值。这意味着,i = df1x[i] 语法中。

    df2[df1]
    
  2. 我们需要加入df2$ddf1$b。使用on= 会是:

    df2[df1, on=c(d="b")]
    
  3. 我们只需要c 列。使用j 仅选择该列。

    df2[df1, c, on=c(d="b")]
    
  4. 我们不需要 equi-join,而是 滚动到最近的 加入。

    df2[df1, c, on=c(d="b"), roll="nearest"]
    

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 2019-08-20
    • 2020-08-02
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多