将行中的 negative/positive 个值除以 r 中的另一行?
Divide negative/positive values in row by another row in r?
用dput复制的数据
(我的第一个数据示例,希望足够了)
我有这个 xts 对象 weights
> dput(head(weights,4))
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333,
-0.333333333333333, -0.333333333333333, 0, 0, 0, 0, 0, 0.333333333333333,
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333,
0.333333333333333, 0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.333333333333333, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333,
-0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333,
0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class = c("xts",
"zoo"), index = structure(c(946512000, 949276800, 951782400,
954460800), tzone = "UTC", tclass = "Date"), .Dim = c(4L, 39L
), .Dimnames = list(NULL, c("ABB.N", "ACTELION.N", "ADECCO.N",
"ALUSUISSE.N", "BALOISE.N", "CIBA.SC.N", "CLARIANT.N", "CS.GROUP.N",
"ELEKTROWATT.I", "EMS.CHEMIE", "GEBERIT.N", "GIVAUDAN.N", "JULIUS.BAER.N",
"KUDELSKI.I", "LAFARGEHOLCIM.N", "LONZA.N", "NESTLE.N", "NOBEL.BIOCARE.N",
"NOVARTIS.I", "NOVARTIS.N", "RICHEMONT.N", "ROCHE.GS", "SAIRGROUP.N",
"SBV.N", "SERONO..B..I", "SGS.N", "SULZER.N", "SWATCH.I", "SWATCH.N",
"SWISS.LIFE.HOLDING.AG.N", "SWISS.RE.N", "SWISSCOM.N", "SYNGENTA.N",
"SYNTHES.N", "TRANSOCEAN.N", "UBS.GROUP.N", "UBS.I", "UNAXIS.N20",
"ZURICH.INSURANCE.N")))
和两个数值向量Pos
和Neg
> dput(head(Pos,4))
c(`1999-12-30` = 0.34191022613305, `2000-01-31` = 0.411653443805752,
`2000-02-29` = 0.393078629707615, `2000-03-31` = 0.376686025847744
)
> dput(head(Neg,4))
c(`1999-12-30` = -1.32059915686837, `2000-01-31` = -1.27821843244263,
`2000-02-29` = -1.3142472840903, `2000-03-31` = -1.32647296498383)
我想做什么
我现在想将 weights
中的每个 negative/positive 值除以 Neg
或 Pos
中的相应行(如果 Neg
和 Pos
将被转换为 matrix/dataframe)
问题
我尝试了 for 循环、应用函数和带条件的简单除法,但我从来没有得到想要的结果,这对于这样一个相当简单的任务来说不会那么困难...
xts-objects 的子集似乎也有问题...
这些代码对我不起作用:(主要是尺寸或下标错误...)
For 循环:
weights_adj <- apply(weights,1,function(x) if (coredata(x)[coredata(x)>0]){
coredata(x)[coredata(x)]/Pos
} else if (coredata(x)[coredata(x)<0]){
coredata(x)[coredata(x)]/Neg
})
应用函数:
weights_adj <- apply(weights,1,function(x) (coredata(x)[coredata(x)>0])/Pos)
哪个+适用:
which_negative_weight <- t(apply(weights,1,function (x) which(x<0)))
result_negative <- apply(weights,1,function(x) x[,which_negative_weight[1,]])
哪个+为:
for (i in 1:nrow(weights)){
(weights[i,which_negative_weight[i,]]/Neg[i,])
}
编辑:
@K.Hua的解决方案奏效了,他很快就帮助了我,但是@G.Grothendieck的解决方案更简单更快!
您尝试将大小为 N 的向量的样本除以大小为 N 的整个向量。此外,我认为在列上循环更容易:
weights_adj = weights
neg <- apply(weights,2,function (x) x<0)
for (i in 1:ncol(weights)){
weights_adj[neg[,i],i] = weights[neg[,i],i]/Neg[neg[,i]]
weights_adj[!neg[,i],i] = weights[!neg[,i],i]]/Pos[!neg[,i]]
}
试试这个:
weights / ((weights > 0) * Pos + (weights < 0) * Neg + (weights == 0))
用dput复制的数据
(我的第一个数据示例,希望足够了)
我有这个 xts 对象 weights
> dput(head(weights,4))
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333,
-0.333333333333333, -0.333333333333333, 0, 0, 0, 0, 0, 0.333333333333333,
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333,
0.333333333333333, 0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.333333333333333, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333,
-0.333333333333333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333,
0, 0, 0, 0, -0.333333333333333, -0.333333333333333, -0.333333333333333,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.333333333333333), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", class = c("xts",
"zoo"), index = structure(c(946512000, 949276800, 951782400,
954460800), tzone = "UTC", tclass = "Date"), .Dim = c(4L, 39L
), .Dimnames = list(NULL, c("ABB.N", "ACTELION.N", "ADECCO.N",
"ALUSUISSE.N", "BALOISE.N", "CIBA.SC.N", "CLARIANT.N", "CS.GROUP.N",
"ELEKTROWATT.I", "EMS.CHEMIE", "GEBERIT.N", "GIVAUDAN.N", "JULIUS.BAER.N",
"KUDELSKI.I", "LAFARGEHOLCIM.N", "LONZA.N", "NESTLE.N", "NOBEL.BIOCARE.N",
"NOVARTIS.I", "NOVARTIS.N", "RICHEMONT.N", "ROCHE.GS", "SAIRGROUP.N",
"SBV.N", "SERONO..B..I", "SGS.N", "SULZER.N", "SWATCH.I", "SWATCH.N",
"SWISS.LIFE.HOLDING.AG.N", "SWISS.RE.N", "SWISSCOM.N", "SYNGENTA.N",
"SYNTHES.N", "TRANSOCEAN.N", "UBS.GROUP.N", "UBS.I", "UNAXIS.N20",
"ZURICH.INSURANCE.N")))
和两个数值向量Pos
和Neg
> dput(head(Pos,4))
c(`1999-12-30` = 0.34191022613305, `2000-01-31` = 0.411653443805752,
`2000-02-29` = 0.393078629707615, `2000-03-31` = 0.376686025847744
)
> dput(head(Neg,4))
c(`1999-12-30` = -1.32059915686837, `2000-01-31` = -1.27821843244263,
`2000-02-29` = -1.3142472840903, `2000-03-31` = -1.32647296498383)
我想做什么
我现在想将 weights
中的每个 negative/positive 值除以 Neg
或 Pos
中的相应行(如果 Neg
和 Pos
将被转换为 matrix/dataframe)
问题
我尝试了 for 循环、应用函数和带条件的简单除法,但我从来没有得到想要的结果,这对于这样一个相当简单的任务来说不会那么困难...
这些代码对我不起作用:(主要是尺寸或下标错误...)
For 循环:
weights_adj <- apply(weights,1,function(x) if (coredata(x)[coredata(x)>0]){
coredata(x)[coredata(x)]/Pos
} else if (coredata(x)[coredata(x)<0]){
coredata(x)[coredata(x)]/Neg
})
应用函数:
weights_adj <- apply(weights,1,function(x) (coredata(x)[coredata(x)>0])/Pos)
哪个+适用:
which_negative_weight <- t(apply(weights,1,function (x) which(x<0)))
result_negative <- apply(weights,1,function(x) x[,which_negative_weight[1,]])
哪个+为:
for (i in 1:nrow(weights)){
(weights[i,which_negative_weight[i,]]/Neg[i,])
}
编辑:
@K.Hua的解决方案奏效了,他很快就帮助了我,但是@G.Grothendieck的解决方案更简单更快!
您尝试将大小为 N 的向量的样本除以大小为 N 的整个向量。此外,我认为在列上循环更容易:
weights_adj = weights
neg <- apply(weights,2,function (x) x<0)
for (i in 1:ncol(weights)){
weights_adj[neg[,i],i] = weights[neg[,i],i]/Neg[neg[,i]]
weights_adj[!neg[,i],i] = weights[!neg[,i],i]]/Pos[!neg[,i]]
}
试试这个:
weights / ((weights > 0) * Pos + (weights < 0) * Neg + (weights == 0))