【问题标题】:R: How to get a count for a certain value in a matrix row in R?R:如何在 R 中的矩阵行中获取某个值的计数?
【发布时间】:2013-12-24 00:30:14
【问题描述】:

好的,我有以下问题:

我在 r 的矩阵中有几个等级。 (我通过对资产回报进行排名来获得这一点。Ranks>=3 获得 NA,Ranks

ranks<-matrix(c(1,1,2,NA,NA, 1,2,NA,NA,NA),nrow=2,ncol=5)
returns<-matrix(c(0.3,0.1,-0.5,-0.7,0.2,0.1,0.4,0.05,-0.7,-0.3),nrow=2,ncol=5)

现在,如果我们的投资组合的所有资产均等购买,我可以计算平均回报:

Mat.Ret<-returns*ranks
Mean.Ret<-rowMeans(Mat.Ret,na.rm=TRUE)

但是,我希望可以选择为两个排名提供权重向量,这些权重表明该特定排名在我的投资组合中应占多大的百分比。作为一个例子,我们有一个

的向量
weights<-c(0.7,0.3) 

现在我将如何在我的代码中使用它?我想基本上计算排名*回报*权重。如果表中只有一个等级 1 和一个等级 2,则代码有效。但是我该怎么做这个变量呢?我的意思是一个解决方案是为每个等级计算它在特定行中存在的次数,然后将权重除以该计数。然后我将乘以这个“净重”*排名*回报。 但我不知道如何在代码中做到这一点..有什么帮助吗?

第一条评论后更新 好的,我想保持灵活,可以根据给出某个等级的次数来调整权重。用户可以选择排名前 5 的资产,因此没有一个或多个资产可以共享排名。所以权重的分配必须非常灵活。我编写了一个还不能工作的公式,因为我显然对我猜想的整个矩阵和向量选择语法还没有足够的经验。这是我到目前为止得到的:

ranks<-apply(ranks,1,function(x)distributeWeightsPerMatrixRow(x,weights))

distributeWeightsPerMatrixRow<-function(MatrixRow,Weights){
  if(length(Weights)==length(MatrixRow[!is.na(MatrixRow)])){
    MatrixRow <- Weights[MatrixRow]
  } else {
    for(i in 1:length(MatrixRow)){
      if(!is.na(MatrixRow[i])){
        EqWeights<-length(MatrixRow[MatrixRow==MatrixRow[i]])
        MatrixRow[i]<-sum(Weights[MatrixRow[i]:(MatrixRow[i]+EqWeights-1)])/EqWeights
      }
    }
  }

  return(MatrixRow)
}

EDIT2: 函数似乎可以工作,但是现在生成的排名对象是原始矩阵的转置版本,没有列名..

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    由于您的ranks 是大于零的整数,您可以使用此矩阵来索引向量ranks

    mat.weights <- weights[ranks]
    mat.weighted.ret <- returns * ranks * mat.weights
    

    根据评论更新。

    我想你正在寻找这样的东西:

    if (length(unique(na.omit(as.vector(ranks)))) == 1)
      mat.weights <- (!is.na(ranks)) * 0.5
    else      
      mat.weights <- weights[ranks]
    mat.weighted.ret <- returns * ranks * mat.weights
    

    如果只有一个等级。所有权重变为 0.5。

    【讨论】:

    • 太棒了!如此简单,我已经为此苦苦挣扎了将近一个小时 :-) 非常感谢
    • 几乎可以工作了...我现在有:ranks
    • @MichiZH 查看更新。希望我能正确解释您的评论。
    • 嗨,斯文。首先感谢您的努力。几乎是正确的解决方案,但太严格了:-) 我的意思是在上面给出的这个例子中只有两个相关的等级。但我想保持我的功能灵活,允许更多的资产,让用户说我想投资前 5 名资产。因此,5 个资产可能具有 1 级和 0 级 2-5。当然,这是非常灵活的。请参阅我的更新,了解我目前所获得但还没有工作的示例。
    • @MichiZH 这显然超出了您第一个问题的范围。 Stackoverflow 不鼓励向现有问题添加问题。您应该创建一个新问题并给出一些输入和预期输出的示例。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2021-07-13
    • 2014-08-02
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多