2016-04-03 6 views
0

私は複素数ベクトルを反復するループを作成しようとしており、5つの値のすべてのグループの標準偏差を計算しています。以下は私がこれを実行しようとしたときに書いたコードですが、それを実行しようとすると、NAの大部分が値として正確ではありません。ベクトルを反復して、Rの数値の標準偏差を計算するR

データは53412要素の大きな行列です。約1175行にする必要があります。私はちょうどそれは、それらの各Iは、ループでそれを行うにしようとしたとき、しかし、正常に動作コンソール

sd(data[seq((5) + 1,(5*i) + 5),6]) 
sd(data[seq((10) + 1,(10) + 5),6]) 
sd(data[seq((15) + 1,(15) + 5),6]) 

に次のように実行し、手動でそれを介してitterateしようとしてきました

for(i in floor((nrow(data)/5)-5)){sd5[i] <-sd(data[seq((5*i) + 1,(5*i) + 5),6])} 

上のコードブロックの2行目と3行目を含め、大半のデータに対してNAを返します。ここで

念のために、私は(私は手動でSDを実行したときに、私は少なくとも、CSVファイルから正しい値をつかんだということを指摘したかった

2016-04-01,108.779999,110.00,108.199997,109.989998,25626200,109.989998 
2016-03-31,109.720001,109.900002,108.879997,108.989998,25685700,108.989998 
2016-03-30,108.650002,110.419998,108.599998,109.559998,45159900,109.559998 
2016-03-29,104.889999,107.790001,104.879997,107.68,30774100,107.68 
2016-03-28,106.00,106.190002,105.059998,105.190002,19303600,105.190002 

を読んでいるCSVから数行です)、私はコンソールの出力をCSVファイルと比較しました。しかし、それは私がちょうど見つけることができないような方法で間違って反復しているわけではありません。私は、範囲外のエラーを避けるために、ループを切り捨てるように設定しました。

+0

残りの値はどうすればよいですか? ( 'nrow(data)%% 5!= 0') – MichaelChirico

+0

彼らは私が今やっていることには不必要です。私は在庫の全寿命のために、ビジネス週ごとに終値の標準偏差を追跡しています – Kristoff

答えて

1

ループの必要はありません。for

ベクトルはxとして格納されている場合は、あなたができる:

NN <- length(x) 
x <- x[1:(5*floor(length(x)/5))] 
dim(x) <- c(5, length(x)/5) 
apply(x, 2, sd) 

それはdata.frameになら、私は(sdcurrent devel versionに-optimized GForceあり、特に以来)data.tableを使用したい:

library(data.table); setDT(data) 
data[ , sd(x), by = .(grp = (0:(length(x) - 1) %/% 5))] 
+0

あなたが投稿した最初のソリューションを5で割り切れない長さの仕事にする方法はありますか?余りはそれほど重要ではないので投げてください。 – Kristoff

+0

dim5(temp1 [、6])< - c(5、length(temp1 [、6])/ 5)のエラーは、毎日変更されるため、5日ごとに5で割り切れます。 dims [製品8900]オブジェクトの長さに一致しません[8902] – Kristoff

+0

@Kristoff編集を参照してください。これはコピーを作ることを必要としますが、何かを覚えておいてください。 – MichaelChirico

1

5列(または行)の行列に再作成し、行(または列)のFUNを取得することができます

そして行列がとても大きいので、あなたはmatrixStatsライブラリ

mm <- read.csv(header = FALSE, text = "2016-04-01,108.779999,110.00,108.199997,109.989998,25626200,109.989998 
2016-03-31,109.720001,109.900002,108.879997,108.989998,25685700,108.989998 
           2016-03-30,108.650002,110.419998,108.599998,109.559998,45159900,109.559998 
           2016-03-29,104.889999,107.790001,104.879997,107.68,30774100,107.68 
           2016-03-28,106.00,106.190002,105.059998,105.190002,19303600,105.190002") 

set.seed(1) 
mm <- mm[, -1] 
mm <- matrix(sample(unlist(mm), 1500 * 55000, TRUE), 1500) 
# num [1:1500, 1:55000] 110 109 110 110 110 ... 

m2 <- matrix(mm, ncol = 5, byrow = TRUE) 
#  [,1]  [,2]  [,3] [,4]  [,5] 
# [1,] 110.42  108.88  109.56 109.56  109.90 
# [2,] 108.99  107.68  105.19 107.68  109.72 
# [3,] 109.90  110.00 25626200.00 108.88 30774100.00 
# [4,] 105.06 25685700.00  105.19 108.88 30774100.00 
# [5,] 107.68  109.90  105.19 104.89  107.79 
# [6,] 108.88  108.78  108.88 108.99  108.20 

system.time({ 
    sds <- apply(m2, 1, sd) 
}) 

# user system elapsed 
## a damn long time 
# Timing stopped at: 114.028 0.81 115.398 

library('matrixStats') 
system.time({ 
    sds <- rowSds(m2) 
}) 

# user system elapsed 
# 0.347 0.051 0.402 

head(sds) 
# [1] 5.620328e-01 1.726982e+00 1.555266e+07 1.556640e+07 2.072692e+00 3.141340e-01 
+0

'rowSds'、nice。印象的な。 – MichaelChirico

0

を使用することができます私はこの出力はひどく興味深いことが、少なくとも、あなたはありません。この

chunk <- function(y, xs, zs=list()) 
    if (length(xs)<y) zs else chunk(y, xs[-y:-1], c(zs,list(xs[1:y]))) 

Map(sd, chunk(5, data)) 

ようにそれを行う可能性があります効果的にやっていることは

Map(sd, chunk(5, 1:18)) 
[[1]] 
[1] 1.581139 

[[2]] 
[1] 1.581139 

[[3]] 
[1] 1.581139 

この

ワーキング見ることができます

list(
    sd(1:5), 
    sd(6:10), 
    sd(11:15) 
) 
# 16:18 is discarded because it does not make a complete chunk 

これは、あなたのCSVから特定の列を選択することは何もしません。あなた自身でそれをしなくてはなりません。完全なチャンクを作成しない後続の要素はすべて破棄されます。実際の結果を得るには、データをプラグインします。

関連する問題