(R)组中观察值相对于所有其他观察值的加权差异

时间:2019-01-21 16:05:08

标签: r dplyr

我有以下示例数据。 X,Y和Z共分为三个组,观察值1至9分为这些组。对于每次观察,我观察变量A和B。因此:

test <- data.frame(
  id = 1:9,
  group = c(rep("X", 3), rep("Y", 3), rep("Z", 3)),
  A = seq(from = 0.15, to = 0.55, by = 0.05),
  B = 5:13
)

哪个给

  id group    A  B
1  1     X 0.15  5
2  2     X 0.20  6
3  3     X 0.25  7
4  4     Y 0.30  8
5  5     Y 0.35  9
6  6     Y 0.40 10
7  7     Z 0.45 11
8  8     Z 0.50 12
9  9     Z 0.55 13

一段时间以来,我一直在努力实现以下目标:对于每个观察值1到9,求和该观察值的A值相对于该观察组的所有其他观察值的A值的加权差。因此,对于观察值1至4(作为示例),它应如下所示:

id 1: (0.15 - 0.15) * 5 + (0.15 - 0.20) * 6 + (0.15 - 0.25) * 7 = -1
id 2: (0.20 - 0.15) * 5 + (0.20 - 0.20) * 6 + (0.20 - 0.25) * 7 = -0.1
id 3: (0.25 - 0.15) * 5 + (0.25 - 0.20) * 6 + (0.25 - 0.25) * 7 = 0.8
id 4: (0.30 - 0.30) * 8 + (0.30 - 0.35) * 9 + (0.30 - 0.40) * 10 = -1.45

例如,对于观察3,它转换为单词:

第1步:0.25是A上观察值3的值,该值与A上观察值1的值(即0.15)相比较,该差值0.10被5加权(B上观察值1的值)

步骤2:将0.25(A上的观察值3的值)与A上的观察值2的值(0.20)进行比较,并将0.05的差值乘以6(B上的观察2的值)加权

步骤3:将0.25(A上的观测值3的值)与A上(其自身的值)进行比较,并且将0的差值乘以7(B上的自身值)(我认为没有必要执行此步骤)差异0;为了完整起见,将其添加)。

第4步:第1-3步之和

在R中有实现此的可行方法吗?我一直在尝试使用mutategroup_by,但到目前为止仍未成功。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用data.table

> test[, out := colSums(sapply(A, function(x) (x - A) * B)), by = "group"]
> test
   id group    A  B   out
1:  1     X 0.15  5 -1.00
2:  2     X 0.20  6 -0.10
3:  3     X 0.25  7  0.80
4:  4     Y 0.30  8 -1.45
5:  5     Y 0.35  9 -0.10
6:  6     Y 0.40 10  1.25
7:  7     Z 0.45 11 -1.90
8:  8     Z 0.50 12 -0.10
9:  9     Z 0.55 13  1.70

我要做的是:我将自定义函数function(x) (x - A) * B)应用于列A的每个元素,这给了我(A[i] - A[j]) * B[j]元素的矩阵。然后,我对各列求和,得到结果向量。

答案 1 :(得分:0)

您可以使用group_by()和一些线性代数来做到这一点:

library(dplyr)

test <- data.frame(
  id = 1:9,
  group = c(rep("X", 3), rep("Y", 3), rep("Z", 3)),
  A = seq(from = 0.15, to = 0.55, by = 0.05),
  B = 5:13
)

test %>% group_by(group) %>%
  mutate(res = A*sum(B) - c(A%*%B))
#> # A tibble: 9 x 5
#> # Groups:   group [3]
#>      id group     A     B    res
#>   <int> <fct> <dbl> <int>  <dbl>
#> 1     1 X      0.15     5 -1.   
#> 2     2 X      0.2      6 -0.1  
#> 3     3 X      0.25     7  0.800
#> 4     4 Y      0.3      8 -1.45 
#> 5     5 Y      0.35     9 -0.1  
#> 6     6 Y      0.4     10  1.25 
#> 7     7 Z      0.45    11 -1.90 
#> 8     8 Z      0.5     12 -0.1  
#> 9     9 Z      0.55    13  1.70

reprex package(v0.2.1)于2019-01-21创建