2016-08-08 5 views
3

私は数百もの列を持つ大規模な財務データを持っています。私は日付に基づいてデータを整理し、ソートしました。ここでは簡単な例です:多数の列に異なる値を割り当てる

df1 <- data.frame(matrix(vector(),ncol=5, nrow = 4)) 
colnames(df1) <- c("Date","0.4","0.3","0.2","0.1") 
df1[1,] <- c("2000-01-31","0","0","0.05","0.07") 
df1[2,] <- c("2000-02-29","0","0.13","0.17","0.09") 
df1[3,] <- c("2000-03-31","0.03","0.09","0.21","0.01") 
df1[4,] <- c("2004-04-30","0.05","0.03","0.19","0.03") 
df1 
     Date 0.4 0.3 0.2 0.1 
1 2000-01-31  0  0 0.05 0.07 
2 2000-02-29  0 0.13 0.17 0.09 
3 2000-03-31 0.03 0.09 0.21 0.01 
4 2000-04-30 0.05 0.03 0.19 0.03 

私は会社名を気にしないと、私は結果を計算するための重みを必要とするので、私は、列ヘッダとして(生データから市場価値に基づいて)個々の重みを割り当て。

私の究極の目標は、以下を得ることです。1.加重収益の合計。 2.リターンがゼロでない場合のウェイトの合計。例えば

 Date SWeightedR SWeights  
1 2000-01-31   0.017   0.3 
2 2000-02-29   0.082   0.6 
3 2000-03-31   0.082   1 
4 2000-04-30   0.07   1 

を、2000年1月31日= 0.4x0 + 0.3x0 + + 0.1x0.07 0.2x0.05ためSWeightedR、と:それは言われていると、以下の私が取得したい結果がありますSWeights = 0.2 + 0.1。

最初の考えでは、WCol2 <- 0.4のように各列に重みを割り当ててから、cbindを使用して新しい列を作成し、合計を得るにはc(as.matrix() %*%)を使用しました。私はすぐに、何百もの列があるのでこれは不可能であることを認識しています。どんなアドバイスや提案も感謝しています!

+0

例のように、非日付の列の数値は数値( '0.4')か文字(' '0.4" ')ですか? –

+0

tidyrパッケージhttps://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.htmlを使用して、幅広い 'form'から' long'フォームに変換する価値があります。 – momeara

答えて

2

ここでは、行列乗算を使用した単純な解法を提案しています。

まず第一に、あなたのデータは、characterタイプのように見えると私はそれが実際のデータと実際のケースだわからないんだけど、私が最初に適切な型

df1[-1] <- lapply(df1[-1], type.convert) 

次に変換します列名も数値クラスに変換します

vec <- as.numeric(names(df1)[-1]) 

最後に、2つの簡単な手順で簡単に新しい列を作成できます。これには実際に行列変換のオーバーヘッドがありますが、最初は行列で作業する必要があります。いずれにせよ、これは完全に私はこれがローの操作により、基本的

library(data.table) 
res <- melt(setDT(df1), id = 1L, variable.factor = FALSE 
      )[, c("value", "variable") := .(as.numeric(value), as.numeric(variable))] 
res[, .(SWeightedR = sum(variable * value), 
     SWeights = sum(variable * (value > 0))), by = Date] 

#   Date SWeightedR SWeights 
# 1: 2000-01-31  0.017  0.3 
# 2: 2000-02-29  0.082  0.6 
# 3: 2000-03-31  0.082  1.0 
# 4: 2004-04-30  0.070  1.0 
あるとして、それはあまり効率的になると信じているが、あなたが、(ここで data.table例だ)最初の長い形式に変換することができ

df1["SWeightedR"] <- as.matrix(df1[, -1]) %*% vec 
df1["SWeights"] <- (df1[, -c(1, ncol(df1))] > 0) %*% vec 
df1 
#   Date 0.4 0.3 0.2 0.1 SWeightedR SWeights 
# 1 2000-01-31 0.00 0.00 0.05 0.07  0.017  0.3 
# 2 2000-02-29 0.00 0.13 0.17 0.09  0.082  0.6 
# 3 2000-03-31 0.03 0.09 0.21 0.01  0.082  1.0 
# 4 2004-04-30 0.05 0.03 0.19 0.03  0.070  1.0 

または、ベクトル化されました

+0

良いオプションは、一を足す。 – akrun

+0

@David Arenburg私の実際のデータは、「因子」型であることが判明しました。だから、 'df1 [" SWeightedR "] < - as.matrix(df1 [、-1])%*%vec'を適用すると、'数値/複素行列/ベクトル引数を必要とする 'というエラーを返します。私はデータを数値に変換するために 'df2 < - as.matrix(as.data.frame(lapply(df1 [-1]、as.numeric)))'しようとしましたが、データを使い果たしました。 1と2のように)。お知らせ下さい。 –

+0

これはRで係数を数値に変換する方法ではありません。行列の乗算を行う前に、 'df1 [-1] < - lapply(df1 [-1]、function(x)as.numeric(as.character(x)))'を試してください。 –

関連する問題