我有两个不同的数据集,
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")
结果情节看起来像这样,
我想根据df2气泡所在的方框将df1中的值分配给df2。我正在寻找的结果将是df2的副本,但添加了一列df1值。像
这样的东西 df2$val_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.frame
和df1
分配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
包,因为允许计算距离矩阵,在此解决方案中使用欧氏距离考虑变量x
和y
require(pdist)
dists <- pdist(df2[c("x", "y")],
df1[c("x", "y")])
让我们将pdist()
函数的输出转换为矩阵
dists <- as.matrix(dists)
现在,根据生成的矩阵,我们希望获得data.frame
,df2
的每个元素都为df1
提供最近元素的ID assign_value <- data.frame(ID_df2 = df2$ID,
ID_df1 = apply(dists, 1, which.min))
< /强>
data.frame
我们需要将得到的2列val
与df1
的{{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