我有以下示例数据。 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中有实现此的可行方法吗?我一直在尝试使用mutate
和group_by
,但到目前为止仍未成功。非常感谢您的帮助。
答案 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创建