如何在R中保存Loop(带if语句)的结果?

时间:2016-12-26 16:57:58

标签: r loops if-statement for-loop save

是否可以在矢量中保存循环的结果?我的目标是使一个向量(或列表)的日期(向量"礼物")小于一个特定日期(代码中的date_3)。

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

&#34;礼品&#34;表示包含许多日期的向量。 Date_3是特定日期

有人可以帮忙吗? 谢谢

2 个答案:

答案 0 :(得分:1)

for循环是一种非常低效的方法。正如Psidom在评论中指出的那样,你可以完成你想要的任务:

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

使用microbenchmark进行简单比较:

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

结果:

 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

使用Psidom的建议:

img{
   border-radius:50%;
}

比较第二种方法的平均时间大约快82倍。在for循环中追加向量通常是一个坏主意,你应该始终仔细考虑是否真的需要这样做。

答案 1 :(得分: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])