如何根据距离标准将值从一个数据框添加到另一个数据框。

时间:2018-04-25 18:47:40

标签: r

我有两个不同的数据集,

df1 <- data.frame(
x = c(1.25:10.25),
y = c(1.25:10.25),
val = sample(50:150, 100, replace = FALSE)
)

df2 <- data.frame(
x = c(1:10),
y = c(1:10),
val_2 = sample(50:150, 100, replace = FALSE)
)

ggplot(df1, aes(x=x, y=y)) + 
geom_tile(aes(fill=val)) + coord_equal() +
scale_fill_gradient(low = "yellow", high="red") + 
geom_point(data = df2, aes(x = x, y = y, size = val_2), shape = 21, colour ="purple")

结果情节看起来像这样,

enter image description here

我想根据df2气泡所在的方框将df1中的值分配给df2。我正在寻找的结果将是df2的副本,但添加了一列df1值。像

这样的东西

df2$val_1 <-

并且右侧代码可能有一些距离标准。

1 个答案:

答案 0 :(得分:0)

考虑到所呈现的样本数据和重现的示例,可以通过以下方式给出解决方案:

require(dplyr)
df2$val_1 <- left_join(df2,
                       df1 %>% mutate(x = round(x,0), y = round(y,0)),
                       by = c("x" = "x", "y" = "y")) %>%
        pull(val)



相反,如果您想使用基于距离的更通用的方法来接近它。我建议如下:

首先,为primary key data.framedf1分配df2非常重要:

df1 <- data.frame(
        ID = seq.int(1:100),
        x = c(1.25:10.25),
        y = c(1.25:10.25),
        val = sample(50:150, 100, replace = FALSE)
)

df2 <- data.frame(
        ID = seq.int(1:100),
        x = c(1:10),
        y = c(1:10),
        val_2 = sample(50:150, 100, replace = FALSE)
)

我们需要安装pdist包,因为允许计算距离矩阵,在此解决方案中使用欧氏距离考虑变量xy

require(pdist)
dists <- pdist(df2[c("x", "y")],
               df1[c("x", "y")])

让我们将pdist()函数的输出转换为矩阵

dists <- as.matrix(dists)

现在,根据生成的矩阵,我们希望获得data.framedf2的每个元素都为df1提供最近元素的ID assign_value <- data.frame(ID_df2 = df2$ID, ID_df1 = apply(dists, 1, which.min)) < /强>

data.frame

我们需要将得到的2列valdf1的{​​{1}}功能进行整合:

assign_value <- left_join(assign_value,
                          df1[c("ID", "val")],
                          by = c("ID_df1" = "ID"))

最后,我们获得了一个具有以下结构的data.frame:“每行引用df2的唯一元素,并且链接到ID df1中最近的元素及其val “:

  ID_df2 ID_df1 val
1      1      1  70
2      2      2 132

要获得最终的data.frame,我们只需使用所需的功能执行简单的left_join。

alternative_solution <- dplyr::left_join(df2,
                        assign_value[c("ID_df2", "val")],
                        by = c("ID" = "ID_df2"))

> identical(df2$val_2, alternative_solution$val)
[1] TRUE