首页 文章

基于R中分位数的布尔矩阵

提问于
浏览
-2

我有一个矩阵,其列是股票回报,其行是日期,如下所示:

ES1.Index    VG1.Index   TY1.Comdty    RX1.Comdty   GC1.Comdty
1999-01-05  0.009828476  0.012405717 -0.003058466 -0.0003480884 -0.001723317
1999-01-06  0.021310816  0.027030061  0.001883240  0.0017392317  0.002425398
1999-01-07 -0.001952962 -0.016130850 -0.002826191 -0.0011591516  0.013425435
1999-01-08  0.007989946 -0.004071275 -0.005913678  0.0016224363 -0.001363540

我想要一个函数返回一个矩阵,该矩阵具有相同的列名和行名,根据每个行向量中的每个观察是否属于两个给定分位数内的某个组,填充1和0 .

例如,我可能想要将每个行向量分成3组,并且对于属于第二组的所有观察值和其他地方的0都有1 . 结果看起来像:

ES1.Index VG1.Index TY1.Comdty RX1.Comdty GC1.Comdty
1999-01-05         0         0          1          1          0
1999-01-06         1         0          0          1          0
1999-01-07         0         1          0          0          1
1999-01-08         0         0          1          0          1

(我的例子中的1和0只是一个视觉结果,数字不准确)

哪个是最简单的方法?

2 回答

  • 1

    采取找到分位数的中间步骤并对其进行测试是没有必要的 . 只有每个向量的序数属性很重要 .

    # set bounds
    lb = 1/3
    ub = 2/3
    
    # find ranks
    p = t(apply(m,1,rank))/ncol(m)
    
    # test ranks against bounds
    +( p >= lb & p <= ub )
    
    
               ES1.Index VG1.Index TY1.Comdty RX1.Comdty GC1.Comdty
    1999-01-05         0         0          0          1          1
    1999-01-06         0         0          1          0          1
    1999-01-07         1         0          1          0          0
    1999-01-08         0         1          0          0          1
    
  • 0

    我们可以使用带有 MARGIN=1apply 来循环遍历行 cut 每个 row 向量与 quantile 指定的 breaks ,转置输出以获得输出 .

    t(apply(df1, 1, function(x) {
           x1 <- cut(x, breaks= quantile(x, seq(0, 1,1/3)))
           +(levels(x1)[2]== x1 & !is.na(x1))}))
    

相关问题