![](/img/trans.png)
[英]Calculate difference between one observation and all other observations by group
[英]Weighted difference of observation relative to all other observation in a group (R)
我有以下示例數據。 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
,但是到目前為止沒有成功。 任何幫助深表感謝。
您可以嘗試使用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]
元素。 然后,我對各列求和,得到結果向量。
您可以使用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軟件包 (v0.2.1)創建於2019-01-21
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.