2017-02-28 5 views
0

私は10倍のポートフォリオを作るのに困っています。 This is my dataset: X 行は1会計期間を表し、列は企業を表します。データセットをデシルに分割するR

私は各期間ごとにすべての分位点の値を取得しようとしました。この Result of quantiles in each periods, column represents periods

をもたらし、

Decile_X <- data.frame(matrix(nrow = 11, ncol = 56)) 
    for(i in 1:56){ 
    Decile_X[,i]<-as.numeric(quantile(X[i,], prob = seq(0, 1,length = 11), 
type = 5, na.rm=T))} 

私はXデータセットに0%〜10%、10%〜20%... 90%〜100%の間の平均値を取得しようとしました。この結果に各期間において。

Df <- data.frame(matrix(nrow = 10, ncol = 56)) 
for(i in 1:nrow(TaxExpense)){ 
    for(j in 1:10){ 
    Df[j,i] <- mean(rowMeans(X[i, which(!is.na(Decile_X[i,]) & 
     X[i,]>Decile_X[j,i] & X[i,]<=Decile_X[j+1,i])], na.rm=T)) 

しかし、問題はDecile_Xで、いくつかの期間に0.000000000% 40〜50%、〜60%、50%、60%〜70%を示し、そのため、私は正確に分割することができないということです。

この問題の解決方法はありますか? 私の方法はデシルポートフォリオを作るのに非常に非効率的ですか?

私はRが初めてで、詳細に説明しようとしました。 私を助けてください。

+0

dplyrをデシルに分割するには、mydata%>% mutate(quantile = ntile(x1、10))を使用できます。 x1はデシルに分割するために使用する列です。 – JonGrub

答えて

0

私はあなたのジレンマを正しく理解したいと思っています。

これは基本的に、デシール内の算術平均を計算するために行うものです。しかし、まず、ダミーのデータを追加しました.RのIDEにコピーするだけであれば、変更することなくサンプルとして機能するはずです。

# Some dummy data 
c1 <- c(1:100) 
c2 <- c(301:400) 
c3 <- c(101:200) 
c4 <- c(201:300) 
df <- cbind(c1, c2, c3, c4) 

は、ここで私は、もっと良い言葉がないために、そこにあるどのように多くの「パーティション」との関係で数quant_nを設定します。

quant_n <- 10 # 10 for decile, 4 for quartile, et cetera. 
# Function for computing mean within each part of the n-tile 
quantile_ave <- function(x, y = quant_n){ 
    z <- 1/y 
    q = quantile(x, seq(0, 1, by = z)) 
    cuts = cut(x, q) 
    values_per_quantile = split(x, cuts) 
    calc_mean = sapply(values_per_quantile, mean) 
    names(calc_mean) <- NULL 
    calc_mean 
} 

#Here we put the quantile_ave to work on the dummy data in df 
results <- matrix(0L, nrow = quant_n, ncol = ncol(df)) #Matrix to overwrite with results 
for (i in 1:ncol(df)){ 
    results[, i] <- quantile_ave(df[, i]) 
} 

希望します。

+0

ありがとう!あなたのコードに基づいて私の問題を解決しました!もう一度ありがとう〜 – SGod

関連する問題