首先,请原谅新手的第一个问题,他在过去确实得到了许多其他问题和许多非常有帮助的答案的帮助。
我有一个大文件(数百万行),其中一列偶尔会有缺失值,我希望用该有效值替换所有低于有效值的缺失值。 for 循环有效,但速度非常慢,我想对其进行矢量化处理。
一个玩具示例显示它使用 for 循环完美地充分工作。
Q=c(NA,NA,1, NA,NA,NA,NA, 2, NA,NA,NA,NA, 3, NA,NA,NA,NA,NA)
C=c(NA,NA,NA, NA,NA,NA,NA, NA, NA,NA,NA,NA, NA, NA,NA,NA,NA,NA)
df=data.frame(Q,C)
for ( i in 2:dim(df)[1]){
df$C[i]= df$Q[i]
if (is.na(df$C[i])) {df$C[i]=df$C[i-1]}
}
作为行向量,一个有 Q= { NA NA 1 NA NA NA NA 2 NA NA NA NA 3 NA NA NA NA NA} C = {NA NA 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3} 这就是所需要的。
尝试对其进行矢量化:
Q=c(NA,NA,1, NA,NA,NA,NA, 2, NA,NA,NA,NA, 3, NA,NA,NA,NA,NA)
C=c(NA,NA,NA, NA,NA,NA,NA, NA, NA,NA,NA,NA, NA, NA,NA,NA,NA,NA)
df=data.frame(Q,C)
df$C=df$Q
df$C=ifelse( is.na(df$C), lag(df$C), df$C)`
现在给出 C 作为行向量,如下所示: C = {NA NA 1 1 NA NA NA 2 2 NA NA NA 3 3 NA NA NA NA} 只有下一个缺失值被替换,而我希望它们全部被替换。但是如何呢?
我确实想知道如何将它放入一个循环中,以便 ifelse() 函数不断迭代,直到不再有任何缺失值,但这看起来非常难看,并且可能有很长的间隔充满 NA。搜索互联网还没有找到任何令人满意的答案来解决感觉简单的编码问题。
非常感谢任何帮助。谢谢,克里斯
我们可以使用
fill
来自tidyr
library(dplyr)
library(tidyr)
df %>%
mutate(C = Q) %>%
fill(Q)