【问题标题】:Divide negative/positive values in row by another row in r?将行中的负/正值除以r中的另一行?
【发布时间】:2018-12-13 19:00:30
【问题描述】:

使用 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")))

还有两个数字向量PosNeg

> 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 中的每个负/正值除以NegPos 中的相应行(如果要将NegPos 转换为矩阵/数据帧)

问题

我尝试了 for-loops、apply-functions 和带条件的简单除法,但我从来没有得到想要的结果,对于这样一个相当简单的任务来说这不是那么困难......

From the last problem I had 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 的解决方案更简单、更快!

【问题讨论】:

  • 如果一行中有一个值为负数,那么整行是否为负数?
  • 不为什么会这样?

标签: r dataframe subset apply xts


【解决方案1】:

试试这个:

weights / ((weights > 0) * Pos + (weights < 0) * Neg + (weights == 0))

【讨论】:

    【解决方案2】:

    您尝试将大小为 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]]
    }
    

    【讨论】:

    • 哇,它确实有效。您能否进一步解释我的方法到底出了什么问题?我还没有掌握它......
    • 我从来不知道可以简单地将逻辑向量作为列子集参数???
    • 正如我所说,您尝试除以整个向量 'Neg' 或 'Pos' 但您正在对要划分的行进行采样,因此出现了维度错误。另外,通常使用 R 中的列比使用行更好,因为您通常确定您正在处理相同的变量类
    • 好的,感谢您的进一步解释,一定会记住这一点!
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多