[英]R: How to calculate the sum of the possible columns combinations
I calculated the following:我计算如下:
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']
However, I was wondering if there is a way to smooth a bit the code.但是,我想知道是否有一种方法可以使代码平滑一些。 I tried with a
for
statement without success.我尝试使用
for
语句但没有成功。
Do you have any idea?你有什么主意吗?
Thank you谢谢
We can use crossing
to create all the combinations, then loop over the rows with pmap
, select
the columns from dataset_definition
and reduce
by adding ( +
) the columns我们可以使用
crossing
来创建所有组合,然后使用pmap
遍历行, select
来自dataset_definition
的列并通过添加 ( +
) 列来reduce
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")
Maybe you can try Reduce
like below也许你可以像下面这样尝试
Reduce
out <- list2DF(
setNames(
Reduce(`+`, df, accumulate = TRUE)[-1],
paste0(names(df)[1], ".", names(df)[-1])
)
)
which gives这使
> 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
Dummy Data虚拟数据
> 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
Using growing seq
uences to subset data, and the rowSums
.使用增长的
rowSums
seq
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
Data:数据:
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")
In a worst case scenario, you could use apply
:在最坏的情况下,您可以使用
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.