我有一个矩阵,其列是股票回报,其行是日期,如下所示:
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只是视觉结果,数字不准确)
哪种方式最简单?
答案 0 :(得分: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
答案 1 :(得分:0)
我们可以apply
与MARGIN=1
一起循环使用cut
指定row
的每个breaks
向量行quantile
,转置输出以获得输出。
t(apply(df1, 1, function(x) {
x1 <- cut(x, breaks= quantile(x, seq(0, 1,1/3)))
+(levels(x1)[2]== x1 & !is.na(x1))}))