是否有可能将循环的结果保存在向量中?我的目标是创建一个矢量(或列表),其中包含小于一个特定日期(代码中的date_3)的日期(矢量“礼物”)的日期。如何在R中保存循环的结果(使用if语句)?
for (i in 1:21) {
if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) {
print(gifts[i])
}
}
“礼物”表示包含多个日期的向量。 Date_3是特定日期
任何人都可以帮忙吗? 谢谢
是否有可能将循环的结果保存在向量中?我的目标是创建一个矢量(或列表),其中包含小于一个特定日期(代码中的date_3)的日期(矢量“礼物”)的日期。如何在R中保存循环的结果(使用if语句)?
for (i in 1:21) {
if ((!is.na(gifts[i])) & (gifts[i] < Date_3)) {
print(gifts[i])
}
}
“礼物”表示包含多个日期的向量。 Date_3是特定日期
任何人都可以帮忙吗? 谢谢
一个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循环中的向量通常是一个坏主意,你应该总是仔细思考,如果你真的需要这样做。
当我想要做的结果存储在动态长度的向量,我通常是这样存储在向量:
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])
。
你不需要for循环。 'na.omit(礼物[礼物
Psidom
谢谢,这是完美的! ;) – ClS