R函数用滞后值替换NAs

问题描述 投票:0回答:1

我正在尝试编写一个函数,用R中的滞后值替换数据帧中所选变量的缺失值(我使用一个obs。lag)。我已经成功编写了以下for循环来做到这一点:

testdata <- data.frame(x1 = c(1:10), 
                       x2 = c(4, 3, NA, 7, 8, NA, 9, NA, 10, 11), 
                       x3 = c(4, 3, NA, 7, 8, NA, 9, NA, NA, 11),
                       x4 = c("a", NA, NA, "d", "e", NA, "f", NA, "g", NA))

for (j in 2:4){
  for (i in 1:10){
    if(is.na(testdata[i, j])){
      testdata[i, j] <- testdata[i - 1, j]
    }}}

for循环工作正常,但是我将泛化此代码并将其写入一个函数,该函数创建一个空列表。我写的函数如下:

fill_null <- function(df, columns, rows){
  for (j in columns){
    for(i in rows){
      if(is.na(df[i, j])){
        df[i,j] <- df[i - 1, j]
      } else{
        df[i, j] <- df[i, j]
      }}}}

当我使用以下代码运行此功能时:

newdf <- fill_null(testdata, 2:4, 1:10)
str(newdf)

我得到以下输出:

> str(newdf)
 NULL

我想知道为什么当没有在函数中调用此for循环但将其写入函数后停止工作时,为什么它会起作用。我还想知道是否有解决此问题的简便方法,因为我必须用几个不同数据帧的滞后值填充NA。

r function for-loop lag fillna
1个回答
0
投票

在R中,除非另行通知,否则函数将返回生成的最后一个值。在您的函数中,您可能会认为最后一个值是df,但实际上它是for循环。一种简单的演示方法是test <- for(x in 1:3){x}; test,它返回“ NULL”。

© www.soinside.com 2019 - 2024. All rights reserved.