r语言 - 在一列中具有相同值的值的交叉



我有一个看起来像这样的数据框架(非常简化):

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

相关内容

  • 没有找到相关文章

最新更新