2016-12-26 4 views
-1

ループの結果をベクターに保存することはできますか?私の目標は、ある特定の日付(コード中の日付_3)よりも小さい日付(ベクトル "ギフト")を持つベクトル(またはリスト)を持つことです。Rの結果(if文付き)をRに保存する方法は?

for (i in 1:21) { 
if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
    print(gifts[i]) 
} 
} 

「ギフト」は、複数の日付を含むベクターを表します。 Date_3は特定の日付です

誰でも手助けできますか? ありがとう

+2

forループは必要ありません。 'na.omit(プレゼント(gift Psidom

+0

ありがとう、それは完璧に動作します! ;) – ClS

答えて

1

forループは非常に非効率的な方法です。何Psidomを

Unit: milliseconds 
    min  lq  mean median  uq  max  neval 
1.306957 1.329337 1.400435 1.350478 1.378751 2.45866 100 

と使用:で

gifts = seq(as.Date("1910/1/1"), as.Date("1930/1/1"), "years") 
Date_3 = as.Date("1921-01-01") 

microbenchmark({ 
    a = vector() 
    for (i in gifts) { 
     if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
      a = c(a, gifts[i]) 
     } 
    } 
}) 

結果:マイクロベンチマークを使用して

na.omit(gifts[gifts < Date_3]) 

単純な比較:コメントにPsidomで指摘したように、あなたはあなたが欲しいものを達成することができます提案:

microbenchmark(
    na.omit(gifts[gifts < Date_3]) 
) 
Unit: microseconds 
min  lq  mean median  uq max  neval 
14.674 15.6745 16.99335 16.026 16.512 67.95 100 

平均時間を比較すると、2番目のアプローチは約82倍高速です。 forループ内のベクトルに追加するのは、通常は悪い考えです。実際に行う必要がある場合は、常に慎重に考える必要があります。

0

私は、動的長さのベクトルに格納結果をしたいとき、私は通常、ベクターに格納し、この方法:

results <- vector()  
for (i in 1:21) { 
    if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) { 
     results[length(results)+1] <- gifts[i] 
    } 
} 

注これは動的なデータを読ん場合、私は次のように、使用する何であること私はベクトルをtmp変数で埋める特定のデータのファイルを掘り下げています。 Psidomは、この場合の最も効率的な方法がna.omit(gifts[gifts < Date_3])であることは間違いありません。

関連する問題