我有一个看起来像这样的数据框架(非常简化):
Fund Weight Value1 Value2
A 0.3 83 100
A 0.2 62 150
A 0.4 70 70
A 0.1 80 180
B 0.15 87 120
B 0.25 91 80
B 0.5 76 170
B 0.2 12 110
我想做的是计算每个基金的权重和其他列之间的叉积。
最后,我想要一个像这样的数据帧:
Fund Value1 Value2
A 73.3 106
B 76.2 145
到目前为止,我只设法计算了每个基金的单独数据框架的交叉乘积,这不是一个可行的选择,因为数据框架太大了。
任何帮助都将是非常感激的。
df %>%
group_by(Fund) %>%
summarise(across(Value1:Value2, weighted.mean, Weight), .groups = 'drop')
# A tibble: 2 x 3
Fund Value1 Value2
<chr> <dbl> <dbl>
1 A 73.3 106
2 B 69.3 132.
或
df %>%
group_by(Fund) %>%
summarise(vals = crossprod(Weight, as.matrix(across(Value1:Value2))))
甚至:
df %>%
group_by(Fund) %>%
summarise(across(Value1:Value2, ~c(.x %*% Weight)), .groups = 'drop')
# A tibble: 2 x 3
Fund Value1 Value2
<chr> <dbl> <dbl>
1 A 73.3 106
2 B 76.2 145
我们可以将'Value'列与Weight
相乘,得到'Fund'分组后的sum
library(dplyr)
df1 %>%
group_by(Fund) %>%
summarise(across(starts_with("Value"), ~ sum(.x * Weight)), .groups = "drop")
与产出
# A tibble: 2 × 3
Fund Value1 Value2
<chr> <dbl> <dbl>
1 A 73.3 106
2 B 76.2 145
或者可以使用fsum
,这更容易
library(collapse)
fsum(gvr(df1, "^Value"), g = df1$Fund, w = df1$Weight)
Value1 Value2
A 73.3 106
B 76.2 145
基本R代码
> aggregate(df[-(1:2)]*df$Weight, df[1],sum)
Fund Value1 Value2
1 A 73.3 106
2 B 76.2 145