2017-05-01 17 views
2

私が現在行っているデータ評価では、 "for"ループを使って行列を書きたいと思っています。Rの "for"ループを使って行列を書く方法は?

のは、私は0と100の間の乱数を持っているとしましょう:

E <- runif(100, 0, 100) 

t <- 0 #start 

for(t in 0:90) { 
    D <- length(E[E >= t, E < (t + 10)]) 
    t = t + 10 
} 

は、だから私は何をしたいのか1列目の「T」と「D」との各反復で行列の中に「D」を書き込んでもう片方に。

私はRでループを避けるべきだと聞いたことがありますが、私は代替手段を知りません。

答えて

5

ではなくループを使用して、あなたが行列を作成するために、シーケンス内の各アイテムで動作し、ベクトルに結果を格納する、sapplyでこれを行う、その後、cbindことができます。

E <- runif(100, 0, 100) 
t <- seq(0, 90, 10) 

D <- sapply(t, function(ti) { 
    sum(E >= ti & E < (ti + 10)) 
}) 

cbind(t, D) 
#>  t D 
#> [1,] 0 11 
#> [2,] 10 12 
#> [3,] 20 14 
#> [4,] 30 11 
#> [5,] 40 9 
#> [6,] 50 12 
#> [7,] 60 7 
#> [8,] 70 7 
#> [9,] 80 6 
#> [10,] 90 11 

。なお、 Eの項目の数がtより大きく、t + 10よりも小さいことを見つけるためのやや短い方法として、length(length(E[E >= ti & E < (ti + 10)]))ではなくsum(E >= ti & E < (ti + 10))を使用しました。

+0

ああありがとうとても!それは多くの助けになります! – Tarkus

+2

@Tarkusようこそ。 'findInterval'はビンニング項目の点で探しているものであり、' findInterval'はあなたが探している項目を扱うので、この*特定のアプリケーションでは 'cbind(t、table(findInterval(E、t))) tableは値を数えます。 –

0

あなたがカテゴリにビンにあなたの変数をしたいようだ - これはcutはまったく同じものです:

E <- runif(100, 0, 100) 
table(cut(E, breaks = seq(0,100,10), right=FALSE)) 

#> [0,10) [10,20) [20,30) [30,40) [40,50) [50,60) [60,70) [70,80) [80,90) 
#>  10  10  7  10  8  10  12  11  10 
#>[90,100) 
#>  12 

あなたがtable呼び出しを削除、カテゴリラベルを表示したくない場合は、 「表形式」の形式にしたい場合は、as.matrixにラップしてください。

あなたが目的をプロットするためにそれをやっている場合は、histggplotの両方があなたのためにそれを自動的に行いますので、予めご了承ください。

hist(E, breaks = seq(0,100,10)) 

hist output

library("ggplot2") 
ggplot(data.frame(var=E), aes(x=var)) + geom_histogram(binwidth = 10) 

ggplot output

関連する問題