2017-01-05 14 views
1

これまでに質問されたことがありがたく思っていますが、しばらく検索しましたが、質問に答えられるものが見つかりませんでした。私はRを使用していくらか快適ですが、基本を学んだことはありません。ここに私がやろうとしていることがあります。R:データフレーム内のベクトルと列の値を比較する

私は次のようになりますベクトル( "responseTimes" と呼んで)持って

150 50 250 200 100 150 250 

(それははるかに長く、実際のですが、私はここでそれを切り捨てています。)

Iを1つの列timeBinが本質的に0から50までカウントアップするデータフレームもあります(したがって0 50 100 150 200 250など)。

私がしようとしているのは、responseTimesのデータフレームの各行以下の値の数を数えることです。私は自分のデータフレームの新しい列にこれらのカウントを保存したい。 )私はいくつかの定数(例えば、サム(responseTimes> 100へのベクトル要素を比較するために、SUM関数を使用することができます知っている

timeBin counts 
0   0 
50   1 
100  2 
150  4 
200  5 
250  7 

私が示されてきたデータのために私に5を与えるだろう:私の出力は次のようになります。ここで)、私は変化する値(すなわち、timeBin列の各行と比較する)と比較するためにこれを行う方法を知らない。

ループを使用しないことをお勧めします。これらはRで特に遅くなる可能性があり、私はかなり大きなデータセットを持っています。どんな提案も大歓迎です!前もって感謝します。

+0

Perhaphsをあなたは 'table'または' cut'、非常に明確ではない – akrun

答えて

2

あなたはsapplyをこのように使用することができます。

> timeBin <- seq(0, 250, by=50) 
> responseTimes <- c(150, 50, 250, 200, 100, 150, 250) 
> 
> # using sapply (after all `sapply` is a loop) 
> ans <- sapply(timeBin, function(x) sum(responseTimes<=x)) 
> data.frame(timeBin, counts=ans) # your desired output. 
    timeBin counts 
1  0  0 
2  50  1 
3  100  2 
4  150  4 
5  200  5 
6  250  7 
+1

感謝を必要とします!これは完全に機能します。ヘルプをよろしくお願いいたします。 – sahil

1

役立つかもしれない:

responseTimes <- c(150, 50, 250, 200, 100, 150, 250) 
bins1 <- seq(0, 250, by = 50) 


sahil1 <- function(input = responseTimes, binsx = bins1) { 
    tablem <- table(cut(input, binsx)) # count of input across bins 
    tablem <- cumsum(tablem) # cumulative sums 
    return(as.data.frame(tablem)) # table to data frame 
} 
+0

非常に有用な非ループ解です。ありがとう! – sahil

+0

ようこそ。行の名前をビンに変更するだけで –

関連する問題