Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中向量中相似元素的加权平均_R_Weighted Average - Fatal编程技术网

R中向量中相似元素的加权平均

R中向量中相似元素的加权平均,r,weighted-average,R,Weighted Average,我有两个向量x和ww是一个长度与x相同的权重数值向量,给出了x元素的权重 我想给出向量x中元素的加权平均值,它们的差异很小(例如1e-1或1e-2),以减少向量x的长度。例如,这些向量如下所示: w =c(1.459032e-01, 1.535375e-04, 1.829973e-04, 1.057226e-01, 2.833444e-04, 2.559756e-04, 6.440060e-03, 6.294748e-02, 5.984383e-04, 2.772186

我有两个向量
x
w
w
是一个长度与
x
相同的权重数值向量,给出了
x
元素的权重

我想给出向量
x
中元素的加权平均值,它们的差异很小(例如1e-1或1e-2),以减少向量
x
的长度。例如,这些向量如下所示:

    w =c(1.459032e-01, 1.535375e-04, 1.829973e-04, 1.057226e-01, 2.833444e-04,
         2.559756e-04, 6.440060e-03, 6.294748e-02, 5.984383e-04, 2.772186e-04,
         4.869825e-05, 8.212092e-04, 1.233256e-01, 2.558964e-04, 3.990816e-03,
         1.665515e-01, 5.760450e-02, 5.803227e-04, 1.738252e-02, 2.431885e-02,
         1.280266e-03, 1.000000e-03, 1.000117e-03, 2.750921e-03, 3.588227e-03,
         3.489142e-04, 5.117452e-04, 5.117502e-04, 3.262697e-01, 3.060975e-01,
         3.089723e-02, 8.603438e-04, 8.603438e-04, 2.558906e-04, 2.558906e-04,
         7.559512e-04, 1.054060e-03, 8.318323e-04, 8.602753e-04, 8.603439e-04,
         8.269244e-04, 8.602833e-04, 8.979898e-04, 7.745014e-04, 5.117474e-04,
         5.691315e+00, 1.780994e+00, 2.416622e-03, 2.441406e-07, 2.441406e-07,
         3.065381e-05, 2.441406e-07, 2.441328e-07, 2.441324e-07, 2.884505e-07,
         2.441409e-07, 2.441411e-07, 2.441399e-07, 2.441406e-07, 2.441400e-07,
         2.441397e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07,
         2.441406e-07, 2.441406e-07, 2.441404e-07, 2.441406e-07, 1.920616e-03)

     x =c(0.3585121, 0.4399527, 0.5643820, 0.6776966, 0.7542579, 0.8374223, 0.9130900,
          0.9999472, 1.0793771, 1.1249381, 1.1700218, 1.2630534, 1.4131273, 1.4795500,
          1.5388979, 1.6587155, 1.7106946, 1.8248076, 1.9035620, 1.9512584, 2.0362027,
          2.1065388, 2.1525816, 2.2617268, 2.6090246, 2.7180285, 2.7704006, 2.8768953,
          2.9358206, 3.0000000, 3.0655239, 3.1266109, 3.1730078, 3.2681434, 3.3125953,
          3.3620683, 3.4191661, 3.4851182, 3.5373484, 3.5998778, 3.6622245, 3.7306358,
          3.8066598, 3.8726307, 3.9614728, 4.0515907, 4.0998298, 4.1870790, 0.4429813,
          0.5619184, 0.6437753, 0.6856169, 1.1212656, 1.2513217, 1.7290070, 1.9762596,
          2.0103108, 2.0440587, 2.2404542, 2.2742832, 2.5947769, 3.1292874, 3.1730608,
          3.4075734, 3.4651103, 3.5266852, 3.5886457, 3.7197153, 3.7967120, 4.0553866)

我知道如何根据向量x的权重对其进行排序,但如何识别向量x中的类似值,然后获得它们的加权平均值?

更新的答案

像这样的怎么样。。。?(见下面的代码)

我把原始向量称为origx和origw,这样重新排序的向量就是x和w。该代码在x和w(称为xtemp和wtemp)的临时副本上工作,这些副本被销毁,并在变量xnew和wnew中构建新的x和w(即您所寻找的“较短”向量)

简单来说,代码查看xtemp并找到第一个超过阈值大小的间隙(例如0.05),并将从xtemp开始运行到该“大”间隙的所有元素组合在一起。(如果没有这样的间隙,它将整个xtemp作为一个组。)然后,代码将该组转换为一个称为wgroup(组权重的总和)的权重和一个称为xgroup的代表性x值(这样xgroup*wgroup与所有组元素的加权和相同)。然后,我们将xgroup和wgroup保存到向量xnew和wnew中,删除当前组(通过从xtemp和wtemp中删除它),然后以相同的方式继续,直到所有内容都被分组

试运行一下,看看您的想法:)

旧的响应如下(被上面的…)所取代

我建议重新排列x和w,使x以严格的数字顺序排列,然后使用
diff
函数:

reord = order(x)
x2 = x[reord]
w2 = w[reord]
which(diff(x2)<0.01)

您可以看到按数字顺序排列的所有差异,这可能有助于您确定合适的截止值。

您的要求并不明确,特别是考虑到e-01和e-02值不小;e-07值很小。但是:如果你只是想让加权平均数乘以x和w,那么mean()就是结果。我的解释是,目的是找到“向量x中类似的值”。。。如果将这些值组合在一起,则会减少向量x的长度。直观地说,这可能意味着两个具有权重w1和w2的相似元素x1和x2被一个具有权重w1+w2的折衷值x所取代,因此总加权平均值保持不变…@TimP:感谢您的评论,当我们有两个相似的值时,您的解释是正确的,但实际上可能是我有两个以上的相似值(例如3,或4,…相似值0.4和3,4相似值1.7)。我想找到这些相似的值,得到该组的加权平均值,权重为w1+w2+w3+。。。您编写的代码会找到两个相似的值。当它有两个以上的相似值时,我该怎么办?快速澄清:你想选择一个值,如0.01,表示两个元素“接近”,然后如果x包含一个序列,如(1.800,2.000,2.008,2.016,2.200),你会将元素2,3和4分组在一起,因为相邻的距离(2.000到2.008,以及2.008到2.016)两者都小于0.01?即使元素2和4之间的总间隔超过0.01?@TimP:是的。那正是我要找的。我写了一个函数,你可以看到上面,但我不知道为什么循环不停止?非常感谢。这是我的目标。没问题,试一下,如果一切顺利,请告诉我:)
reord = order(x)
x2 = x[reord]
w2 = w[reord]
which(diff(x2)<0.01)
sort(diff(x2))