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