我在数据帧的后续行中有多个缺失值。我想将第一个缺失值替换为其上一行中的非缺失值乘以3,然后使用其上一行中新填充的值乘以3来填充下一个NA值。 这是数据和代码的示例:
df <- mtcars
df[c(2,3,4,5),1] <-NA
IND <- is.na(df[,1])
df[IND,1] <- df[dplyr::lead(IND,1L, F),1] * 3
以上代码的最后一行完成了工作,但逐行执行(我应该运行4次以填充缺少的4行)。我该如何对所有四个缺失行执行一次?
我想要:
df[c(2,3,4,5),1] <- c(63,189,567,1701)
使用一个循环,而不是使用上述代码四次。
答案 0 :(得分:0)
尝试以下基本解决方案:
Fill <- function(x) rep(x[1], length(x)) * 3 ^ (seq_along(x) - 1)
ave(df[, 1], cumsum(!is.na(df[, 1])), FUN = Fill)
给予:
[1] 21.0 63.0 189.0 567.0 1701.0 18.1 14.3 24.4 22.8 19.2
[11] 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9
[21] 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
[31] 15.0 21.4
或者使用此版本的Fill
:
Fill <- function(x) cumprod(replace(x, is.na(x), 3))
答案 1 :(得分:0)
这里是一个for循环,应该可以解决问题:
for(i in 1:nrow(df)){
if(!is.na(df[i,1])){
xx <- df[i,1]
}
if(is.na(df[i,1]))
df[i,1] <-xx
}
}
head(df)
虽然那里可能还有更优雅的解决方案!