2016-12-26 171 views
-1

是否有可能将循环的结果保存在向量中?我的目标是创建一个矢量(或列表),其中包含小于一个特定日期(代码中的date_3)的日期(矢量“礼物”)的日期。如何在R中保存循环的结果(使用if语句)?

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

“礼物”表示包含多个日期的向量。 Date_3是特定日期

任何人都可以帮忙吗? 谢谢

+2

你不需要for循环。 'na.omit(礼物[礼物 Psidom

+0

谢谢,这是完美的! ;) – ClS

回答

1

一个for循环是一个非常低效的方法来做到这一点。由于在评论中指出的Psidom你可以完成你想要什么:使用微基准

na.omit(gifts[gifts < Date_3]) 

一个简单的比较:在

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]) 
     } 
    } 
}) 

结果:

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

用什么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 

比较第二种方法的平均时间大约快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])