如何在 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 < Date_3])
应该足够了。或gifts[which(gifts < 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 < Date_3])
。
【讨论】:
以上是关于如何在 R 中保存循环(使用 if 语句)的结果?的主要内容,如果未能解决你的问题,请参考以下文章