首页 > 解决方案 > R:基于以不同数据集中的点为中心的特定分布从数据集中采样

问题描述

我正在尝试根据 XY 平面上点的分布从 XYZ 空间中的一组点 df_map 中采样行。分布的均值和标准差在另一个数据集 df_pts 中。

我的数据看起来像这样

> df_map
   X  Y   Z
A  6  0 103
B -4  2 102
C -2 15 112
D 13  6 105
E  1 -3 117
F  5 16 105
G 10  5 103
H 14 -7 119
I  8 14 107
J -8 -4 100

> df_pts
    x   y   accuracy
a   5  18 -0.8464018
b   3   2  0.5695678
c -18  14 -0.4711559
d  11  13 -0.7306417
e  -3 -10  2.1887011
f  -9 -11  2.1523923
g   5   1 -0.9612284
h  12 -19 -0.4750582
i -16  20 -1.4554292
j   0  -8  3.4028887

(df_pts[i, x], df_pts[i, y])我想遍历 df_pts 中的行,并根据与 2d 标准差为的距离的高斯分布从 df_map 中选择一行df_pts[i, accuracy]。换句话说,在每个df_map 中,我想根据均值和 2d sdi = 1:10的正态分布从 df_map 中抽取一个样本。df_pts[i, x]^2 + df_pts[i, y]^2df_pts[i, accuracy]

我将不胜感激任何有关有效和复杂的方法的建议。我对 R 比较陌生,并且来自 C 背景,我编写这样的任务的方式涉及太多的基本循环和使用基本操作的每一步计算,这使得代码非常慢。

如果问题太琐碎或结构不合理,我会提前道歉。

标签: rsampling

解决方案


易于使用的数据:

df_map <- data.frame(x = c(6,-4,-2,13,1,5,10,14,8,-8),
                     y= c(0,2,15,6,-3,16,5,-7,14,-4),
                     z= c(103,102,112,105,117,105,103,119,107,100))
df_pts <- data.frame(x = c(5,3,-18,11,-3,-9,5,12,-16,0),
              y= c(18,2,14,13,-10,-11,1,-19,20,-8),
              accuracy = c(-0.8464018, 0.5695678,-0.4711559,-0.7306417, 2.1887011, 2.1523923,-0.9612284,-0.4750582,-1.4554292,3.4028887))

我认为您正在寻找的是最近邻搜索。过去我为此苦苦挣扎,但这是我想出的代码:

library("FNN")

findNeighbour <- function(index){
  first = df_pts[index,1:2]
  hit = get.knnx(df_map[c("x","y")], first, k =1 )
  hit_index = hit[[1]]
  hit_result = df_map[hit_index,]
  result = append(df_pts[index,], hit_result)
}
t <- do.call(rbind, lapply(1:nrow(df_map),findNeighbour))

这导致:

     x   y   accuracy x.1 y.1   z
1    5  18 -0.8464018   5  16 105
2    3   2  0.5695678   6   0 103
3  -18  14 -0.4711559  -2  15 112
4   11  13 -0.7306417   8  14 107
5   -3 -10  2.1887011  -8  -4 100
6   -9 -11  2.1523923  -8  -4 100
7    5   1 -0.9612284   6   0 103
8   12 -19 -0.4750582  14  -7 119
9  -16  20 -1.4554292  -2  15 112
10   0  -8  3.4028887   1  -3 117

正如您所看到的,在此示例中,某些数据被多次匹配,因此根据您的目标,您可能希望将这些数据丢弃或进行双向搜索。

我希望这就是你要找的


推荐阅读