【问题标题】:Conditional multiplying based on column name基于列名的条件乘法
【发布时间】:2021-04-22 08:20:20
【问题描述】:

我已经检查了this solution,但它不适合我的数据结构。

输入

我有一个数据框Portfolio,其中包含公司标识符Indentifier、投资组合权重WeightDates,并且在其余列中至少返回每个Indentifiers 的数据:

# Portfolio

            Indentifier      Weight       Date AIR.PA SCHN.PA ASML.AS  TCH.PA ERICb.ST SASY.PA  RE.PA TELIA.ST NOKIA.HE DAIGn.DE ALSO.PA ...

1               AIR.PA  0.007671609 2003-04-30 0.2164 -0.0112  0.3008  0.2772   0.4247  0.1592 0.2780   0.2138   0.1975   0.1351  0.2908
2               SCHN.PA 0.004302912 2003-05-30 0.1420 -0.0482  0.0904  0.1135   0.0729  0.0168 0.0210   0.0640   0.0092  -0.0744  0.8791
3               SCHN.PA 0.004302912 2003-06-30 0.1317  0.0533 -0.0201 -0.0588   0.0683 -0.0402 0.2177   0.0782  -0.0627   0.1364 -0.1228
4               AIR.PA  0.007671609 2003-06-30 0.3311  0.1661  0.4075  0.0424   0.3646 -0.0176 0.0738   0.0155  -0.0502   0.0556  0.0333
5               AIR.PA  0.007671609 2003-07-31 0.0188  0.0302  0.2328  0.1836   0.0923  0.0220 0.1104  -0.0257   0.0954   0.0810 -0.2774
...

我想将Indentifiers'WeightDate 相乘,返回存储在与Indentifier 具有相同列名的列中。

示例

对于行1Indentifier AIR.PA,以及Date 2003-04-30,计算将是:Weight 0.007671609 * 返回数据0.2164987634241@987634231 @。

理想情况下,PortfolioAIR.PASCHN.PAASML.AS 的输出如下:

# Portfolio

        Date  AIR.PA           SCHN.PA     ASML.AS  ...
        
1 2003-04-30  0.001660              NA          NA
2 2003-05-30        NA       -0.000207          NA
3 2003-06-30  0.002540        0.000229          NA
4 2003-07-31  0.000144              NA          NA   
...

提前感谢您的帮助!最好的问候,托马斯。

【问题讨论】:

    标签: r dataframe multiplication calculated-columns


    【解决方案1】:

    应该像这样直截了当:

    
    dat %>%
        pivot_longer( cols=-c(Identifier,Weight,Date) ) %>%
        mutate( score = Weight * value ) %>%
        filter( Identifier == name ) %>%
        pivot_wider( names_from=name, values_from=score ) %>%
        select( -c(Identifier,Weight,value) ) 
        
    

    应用于您的数据:

    
    dat <- read.table(text=
    "            Identifier      Weight       Date AIR.PA SCHN.PA ASML.AS  TCH.PA ERICb.ST SASY.PA  RE.PA TELIA.ST NOKIA.HE DAIGn.DE ALSO.PA
    1               AIR.PA  0.007671609 2003-04-30 0.2164 -0.0112  0.3008  0.2772   0.4247  0.1592 0.2780   0.2138   0.1975   0.1351  0.2908
    2               SCHN.PA 0.004302912 2003-05-30 0.1420 -0.0482  0.0904  0.1135   0.0729  0.0168 0.0210   0.0640   0.0092  -0.0744  0.8791
    3               SCHN.PA 0.004302912 2003-06-30 0.1317  0.0533 -0.0201 -0.0588   0.0683 -0.0402 0.2177   0.0782  -0.0627   0.1364 -0.1228
    4               AIR.PA  0.007671609 2003-06-30 0.3311  0.1661  0.4075  0.0424   0.3646 -0.0176 0.0738   0.0155  -0.0502   0.0556  0.0333
    5               AIR.PA  0.007671609 2003-07-31 0.0188  0.0302  0.2328  0.1836   0.0923  0.0220 0.1104  -0.0257   0.0954   0.0810 -0.2774
    ", header=TRUE ) %>% mutate( Date = as.Date(Date) )
    
    dat %>%
        pivot_longer( cols=-c(Identifier,Weight,Date) ) %>%
        mutate( score = Weight * value ) %>%
        filter( Identifier == name ) %>%
        pivot_wider( names_from=name, values_from=score ) %>%
        select( -c(Identifier,Weight,value) )
    
    

    生产:

    
    # A tibble: 5 x 3
      Date          AIR.PA   SCHN.PA
    * <date>         <dbl>     <dbl>
    1 2003-04-30  0.00166  NA       
    2 2003-05-30 NA        -0.000207
    3 2003-06-30 NA         0.000229
    4 2003-06-30  0.00254  NA       
    5 2003-07-31  0.000144 NA       
    
    

    【讨论】:

    • 感谢您的帮助!我会更加熟悉pivot_longer()pivot_wider()
    • 不!你会习惯它们,但这需要时间。
    猜你喜欢
    • 2021-01-13
    • 2022-01-14
    • 1970-01-01
    • 2022-08-19
    • 2016-01-15
    • 2022-11-27
    • 2018-12-24
    • 2018-03-27
    • 2021-11-16
    相关资源
    最近更新 更多