使用R

时间:2018-09-26 22:52:48

标签: r loops

我在数据帧的后续行中有多个缺失值。我想将第一个缺失值替换为其上一行中的非缺失值乘以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)

使用一个循环,而不是使用上述代码四次。

2 个答案:

答案 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)

虽然那里可能还有更优雅的解决方案!