2017-09-28 5 views
0

私はステータスのリストを持っています。各リスト要素には、1分ごとのセンサのステータス(1440エントリ、0または1)が含まれています。リストにはすべてのセンサーが含まれています。GNU R:サプリにsapplyを使用

たとえば、statuses[[3]]は、1分ごとに0と1をすべて含む1440エントリのベクトルを返します。

さんが言わせて、内のすべてのセンサーのステータスは、分800は、次のとおりです。

sapply(statuses,'[',800) 

私は毎分アクティブセンサー(すなわち1を示す)の数を取得したいのですが。それ、どうやったら出来るの?どういうわけか一つが

ループのためのあなたが望むものを達成するために、いくつかの方法があるように思えるこの

status_ones <- rep(0,1440) 
for (k in 1:1440){ 
    status_ones[k] <- sum(sapply(statuses,'[',k)) 
} 

答えて

1

のようになります使用してソリューション...この周りに別のsapply()を置くために持っています。これは私が最初に飛び出したものです。リストの各要素の長さが同じであるため、データフレームとして扱い、適用を使用することができます。私は、私はあなたのデータのあなたの記述と一致すると考えているシミュレートされたデータを用いて、以下のこのアプローチを説明する(これは三つのセンサの5回の観測のためになる):

set.seed(42) 
statuses <- lapply(1:3, function(x) sample(0:1, 5, replace=TRUE)) 
statuses 
# [[1]] 
# [1] 1 1 0 1 1 
# 
# [[2]] 
# [1] 1 1 0 1 1 
# 
# [[3]] 
# [1] 0 1 1 0 0 
status_ones <- apply(as.data.frame(statuses), 1, sum) 
status_ones 
# [1] 2 3 1 2 2 

あなたは簡単に手動で確認することができますこれは、あなたがこの小さなで欲しい結果を提供します例。以下は、forループアプローチに、このアプローチの相対速度の恩恵を参照するか、sapplysapplyを使用することができます - 私は、より大きなサンプル(3つのセンサー1440個の観測ずつ)作成し、スピードの違いを見るためにbenchmarkを使用:

library(rbenchmark) 
statuses <- lapply(1:3, function(x) sample(0:1, 1440, replace=TRUE)) 
benchmark(apply=apply(as.data.frame(statuses), 1, sum), 
      sapply=sapply(1:1440, function(x) sum(sapply(statuses, '[', x))), 
      loop=for (i in 1:1440) { sum(sapply(statuses, '[', i)) }, 
      columns=c('test', 'elapsed', 'relative', 'user.self'), 
      order='relative') 
    test elapsed relative user.self 
1 apply 0.883 1.000  0.660 
2 sapply 6.115 6.925  5.616 
3 loop 6.305 7.140  5.776 
関連する問題