【问题标题】:R: How to calculate the sum of the possible columns combinationsR:如何计算可能的列组合的总和
【发布时间】:2021-01-13 18:48:45
【问题描述】:

我计算了以下:

dataset_definitivo1['CAR-5-4'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4']
dataset_definitivo1['CAR-5-3'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3']
dataset_definitivo1['CAR-5-2'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2']
dataset_definitivo1['CAR-5-1'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1']
dataset_definitivo1['CAR-5 0'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0']
dataset_definitivo1['CAR-5 1'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0'] + dataset_definitivo1['AR 1']
dataset_definitivo1['CAR-5 2'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0'] + dataset_definitivo1['AR 1'] + dataset_definitivo1['AR 2']
dataset_definitivo1['CAR-5 3'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0'] + dataset_definitivo1['AR 1'] + dataset_definitivo1['AR 2'] + dataset_definitivo1['AR 3']
dataset_definitivo1['CAR-5 4'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0'] + dataset_definitivo1['AR 1'] + dataset_definitivo1['AR 2'] + dataset_definitivo1['AR 3'] + dataset_definitivo1['AR 4']
dataset_definitivo1['CAR-5 5'] = dataset_definitivo1['AR -5'] + dataset_definitivo1['AR -4'] + dataset_definitivo1['AR -3'] + dataset_definitivo1['AR -2'] + dataset_definitivo1['AR -1'] + dataset_definitivo1['AR 0'] + dataset_definitivo1['AR 1'] + dataset_definitivo1['AR 2'] + dataset_definitivo1['AR 3'] + dataset_definitivo1['AR 4'] + dataset_definitivo1['AR 5']

但是,我想知道是否有办法使代码平滑一点。我尝试了 for 声明但没有成功。

你有什么想法吗?

谢谢

【问题讨论】:

    标签: r sum combinations


    【解决方案1】:

    也许你可以试试Reduce,如下所示

    out <- list2DF(
      setNames(
        Reduce(`+`, df, accumulate = TRUE)[-1],
        paste0(names(df)[1], ".", names(df)[-1])
      )
    )
    

    给了

    > out
          X-5.X-4     X-5.X-3    X-5.X-2    X-5.X-1    X-5.X0     X-5.X1     X-5.X2
    1 -1.44692219  0.06485897 0.01992536  0.9389027  0.882774  2.2414535  1.8264590
    2  0.67107238  1.06091561 1.04472535  1.8268617  1.671066  1.5682784  1.1739885
    3 -0.09730391 -0.71854449 0.22529172  0.2998567 -1.170896 -0.7832241 -0.8425375
    4  2.17106215 -0.04363773 0.77758346 -1.2117682 -1.689918 -1.7437233 -0.6436980
    5  0.02411938  1.14905030 1.74295162  2.3627774  2.780719  1.4036594  2.1668351
           X-5.X3     X-5.X4     X-5.X5
    1  1.66193539  0.9544402  1.3525461
    2  0.92062678  1.2852087  0.6731824
    3 -0.14557409  0.6229588  0.9640785
    4 -0.08703476 -0.1993810 -1.3287441
    5  1.47807943  2.3591872  3.7922109
    

    虚拟数据

    > dput(df)
    structure(list(`X-5` = c(-0.626453810742332, 0.183643324222082,
    -0.835628612410047, 1.59528080213779, 0.329507771815361), `X-4` = c(-0.820468384118015,
    0.487429052428485, 0.738324705129217, 0.575781351653492, -0.305388387156356
    ), `X-3` = c(1.51178116845085, 0.389843236411431, -0.621240580541804, 
    -2.2146998871775, 1.12493091814311), `X-2` = c(-0.0449336090152309,
    -0.0161902630989461, 0.943836210685299, 0.821221195098089, 0.593901321217509
    ), `X-1` = c(0.918977371608218, 0.782136300731067, 0.0745649833651906,
    -1.98935169586337, 0.61982574789471), X0 = c(-0.0561287395290008,
    -0.155795506705329, -1.47075238389927, -0.47815005510862, 0.417941560199702
    ), X1 = c(1.35867955152904, -0.102787727342996, 0.387671611559369,
    -0.0538050405829051, -1.37705955682861), X2 = c(-0.41499456329968,
    -0.394289953710349, -0.0593133967111857, 1.10002537198388, 0.763175748457544
    ), X3 = c(-0.164523596253587, -0.253361680136508, 0.696963375404737,
    0.556663198673657, -0.68875569454952), X4 = c(-0.70749515696212,
    0.36458196213683, 0.768532924515416, -0.112346212150228, 0.881107726454215
    ), X5 = c(0.398105880367068, -0.612026393250771, 0.341119691424425,
    -1.12936309608079, 1.43302370170104)), class = "data.frame", row.names = c(NA,
    -5L))
    
    > df
             X-5        X-4        X-3         X-2         X-1          X0
    1 -0.6264538 -0.8204684  1.5117812 -0.04493361  0.91897737 -0.05612874
    2  0.1836433  0.4874291  0.3898432 -0.01619026  0.78213630 -0.15579551
    3 -0.8356286  0.7383247 -0.6212406  0.94383621  0.07456498 -1.47075238
    4  1.5952808  0.5757814 -2.2146999  0.82122120 -1.98935170 -0.47815006
    5  0.3295078 -0.3053884  1.1249309  0.59390132  0.61982575  0.41794156
               X1         X2         X3         X4         X5
    1  1.35867955 -0.4149946 -0.1645236 -0.7074952  0.3981059
    2 -0.10278773 -0.3942900 -0.2533617  0.3645820 -0.6120264
    3  0.38767161 -0.0593134  0.6969634  0.7685329  0.3411197
    4 -0.05380504  1.1000254  0.5566632 -0.1123462 -1.1293631
    5 -1.37705956  0.7631757 -0.6887557  0.8811077  1.4330237
    

    【讨论】:

    • 谢谢你,它确实有帮助并且有效:)
    【解决方案2】:

    使用不断增长的sequences 来子集数据,以及rowSums

    setNames(as.data.frame(sapply(Map(seq, 1:ncol(d))[-1], function(x) rowSums(d[x]))),
             paste("CAR-5", -4:5))
    #   CAR-5 -4 CAR-5 -3 CAR-5 -2 CAR-5 -1  CAR-5 0  CAR-5 1  CAR-5 2
    # 1     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422
    # 2     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422
    # 3     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422
    #    CAR-5 3  CAR-5 4  CAR-5 5
    # 1 1.539768 1.549768 1.558032
    # 2 1.539768 1.549768 1.558032
    # 3 1.539768 1.549768 1.558032
    

    数据:

    d <- structure(list(`AR -5` = c(1, 1, 1), `AR -4` = c(0.25, 0.25, 
    0.25), `AR -3` = c(0.111111111111111, 0.111111111111111, 0.111111111111111
    ), `AR -2` = c(0.0625, 0.0625, 0.0625), `AR -1` = c(0.04, 0.04, 
    0.04), `AR 0` = c(0.0277777777777778, 0.0277777777777778, 0.0277777777777778
    ), `AR 1` = c(0.0204081632653061, 0.0204081632653061, 0.0204081632653061
    ), `AR 2` = c(0.015625, 0.015625, 0.015625), `AR 3` = c(0.0123456790123457, 
    0.0123456790123457, 0.0123456790123457), `AR 4` = c(0.01, 0.01, 
    0.01), `AR 5` = c(0.00826446280991736, 0.00826446280991736, 0.00826446280991736
    )), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

    • 谢谢你,它确实有帮助并且有效:)
    【解决方案3】:

    我们可以使用 crossing 创建所有组合,然后通过添加 (+) 列来循环使用 pmapselect 来自 dataset_definitionreduce 的列

    library(dplyr)
    library(tidyr)
    library(purrr)
    library(stringr)
    tmp <- crossing(col1 = -5:5, col2 = -5:5)
    nm1 <- paste0("CAR", do.call(paste, tmp))
    
    dataset_definitionvol2 <- tmp %>%
       pmap_dfc(~ dataset_definitionvol %>%
                     select(str_c('AR ', .x:.y)) %>% 
                     reduce(`+`)) %>%
       rename_all(~ nm1) %>%
       bind_cols(dataset_definitionvol, .)
    

    数据

    dataset_definitionvol <- structure(list(`AR -5` = c(1, 1, 1), `AR -4` = c(0.25, 0.25, 
    0.25), `AR -3` = c(0.111111111111111, 0.111111111111111, 0.111111111111111
    ), `AR -2` = c(0.0625, 0.0625, 0.0625), `AR -1` = c(0.04, 0.04, 
    0.04), `AR 0` = c(0.0277777777777778, 0.0277777777777778, 0.0277777777777778
    ), `AR 1` = c(0.0204081632653061, 0.0204081632653061, 0.0204081632653061
    ), `AR 2` = c(0.015625, 0.015625, 0.015625), `AR 3` = c(0.0123456790123457, 
    0.0123456790123457, 0.0123456790123457), `AR 4` = c(0.01, 0.01, 
    0.01), `AR 5` = c(0.00826446280991736, 0.00826446280991736, 0.00826446280991736
    )), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

    • 谢谢,它确实有帮助并且有效:)
    【解决方案4】:

    在最坏的情况下,您可以使用apply

    setNames(data.frame(t(apply(df, 1, cumsum))), paste("CAR-5", -5:5))
    
      CAR-5 -5 CAR-5 -4 CAR-5 -3 CAR-5 -2 CAR-5 -1  CAR-5 0  CAR-5 1  CAR-5 2  CAR-5 3  CAR-5 4  CAR-5 5
    1        1     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422 1.539768 1.549768 1.558032
    2        1     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422 1.539768 1.549768 1.558032
    3        1     1.25 1.361111 1.423611 1.463611 1.491389 1.511797 1.527422 1.539768 1.549768 1.558032
    

    【讨论】:

    • 谢谢你,它确实有帮助并且有效:)
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多