簡體   English   中英

基於 R 中的分位數的布爾矩陣

[英]Matrix of booleans based on quantile in R

我有一個矩陣,其列是股票收益,行是日期,如下所示:

              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 組,並且對於屬於第二組的所有觀察結果為 1,其他地方為 0。 結果看起來像:

           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 只是一個視覺結果,數字不准確)

哪個是最不冗長的方法?

不需要采取中間步驟來查找分位數並針對它們進行測試。 只有每個向量的序數屬性才重要。

# 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

我們可以使用帶有MARGIN=1 apply來循環行,用quantile指定的breaks cut每個row向量,轉置輸出以獲得輸出。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM