【发布时间】:2023-03-03 18:06:01
【问题描述】:
我有一个相当大的向量(长度>500,000)。它包含一堆NA 穿插1 并且始终保证它以1 开头。
我想将v1 中的一些NA 替换为1,基于对另一个向量v2(与v1 长度相同)的连续索引的比较操作。
有没有一种有效的方法以矢量化表示法执行此操作,以便在低级实现中完成循环?也许使用ifelse?
下面的可重现示例:
v1<-c(1,NA,NA,NA,1,NA,NA,NA,NA,NA,1,NA,NA,1,NA,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,1)
v2<-c(10,10,10,9,10,9,9,9,9,9,10,10,10,11,8,12,12,12,12,12,12,12,12,12,12,13)
# goal is to fill through v1 in such a way that whenever
# v1[i] == NA and v1[i-1] == 1 and v2[i] == v2[i-1], then v1[i] == 1
MM<-data.frame(v1,v2)
for (i in 2:length(v1)){
# conditions: v1[i-1] == 1; v1[i]==NA; v2[i]==v2[i-1]
if (!is.na(v1[i-1]) && is.na(v1[i]) && v2[i]==v2[i-1]){
v1[i]<-1
}
}
MM$v1_altered<-v1
MM
【问题讨论】:
-
你能提供一个 v2 的例子吗? IE。 reproducible example...
-
@JoshuaUlrich 我编辑了我的原始帖子,添加了一个可重复的示例。复制粘贴应该可以,谢谢
-
您的可重现示例与您在
v1和v2上运行的初始、不可重现的示例不同。哪个包含你想要的输出? -
@JoshuaUlrich 可重现的例子是正在考虑的问题,很抱歉造成混淆——最初的不可重现是问题的本质,但不是精确的规范