是否可以在矢量中保存循环的结果?我的目标是使一个向量(或列表)的日期(向量"礼物")小于一个特定日期(代码中的date_3)。
for (i in 1:21) {
if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) {
print(gifts[i])
}
}
&#34;礼品&#34;表示包含许多日期的向量。 Date_3是特定日期
有人可以帮忙吗? 谢谢
答案 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])
。