如何在 R 中保存循环(使用 if 语句)的结果?

Posted

技术标签:

【中文标题】如何在 R 中保存循环(使用 if 语句)的结果?【英文标题】:How to save the outcomes of a Loop (with if statement) in R? 【发布时间】:2016-12-26 16:57:58 【问题描述】:

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

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


“Gifts”表示一个包含多个日期的向量。 Date_3 是一个具体的日期

有人可以帮忙吗? 谢谢

【问题讨论】:

您不需要 for 循环。 na.omit(gifts[gifts &lt; Date_3]) 应该足够了。或gifts[which(gifts &lt; Date_3)] 谢谢,完美! ;) 【参考方案1】:

for 循环是一种效率极低的方法。正如 Psidom 在 cmets 上指出的那样,您可以通过以下方式完成您想要的:

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 循环中附加到向量通常是一个坏主意,如果确实需要这样做,您应该始终仔细考虑。

【讨论】:

【参考方案2】:

当我想将结果存储在动态长度的向量中时,我通常以这种方式将其存储在向量中:

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 &lt; Date_3])

【讨论】:

以上是关于如何在 R 中保存循环(使用 if 语句)的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在while循环中处理if语句 - Python

将结果保存在 R 中的循环中

R使用if next break in for循环出错

R:保存循环的结果

R语言中关于for语句中向量循环赋值求助

python中循环语句