如何循环遍历data.frame的列并使用函数

如何循环遍历data.frame的列并使用函数,r,function,scope,R,Function,Scope,这可能已经得到了回答,在这种情况下,我很抱歉重复这个问题,但不幸的是,我找不到问题的答案。我目前正在努力提高代码的可读性,并尝试更频繁地使用函数,但我对它不太熟悉 我有一个data.frame,有些列包含NA,在本例中,我想用一个简单的卡尔曼滤波器进行插值 require(imputeTS) #some test data col <- c("Temp","Prec") df_a <- data.frame(c(10,13,NA,14,17),

这可能已经得到了回答,在这种情况下,我很抱歉重复这个问题,但不幸的是,我找不到问题的答案。我目前正在努力提高代码的可读性,并尝试更频繁地使用函数,但我对它不太熟悉

我有一个
data.frame
,有些列包含
NA
,在本例中,我想用一个简单的卡尔曼滤波器进行插值

require(imputeTS)

#some test data
col <- c("Temp","Prec")
df_a <- data.frame(c(10,13,NA,14,17),
                   c(20,NA,30,NA,NA))
names(df_a) <- col

#this is my function I'd like to use
gapfilling <- function(df,col){
  print(sum(is.na(df[,col])))
  df[,col] <- na_kalman(df[,col])
}

#this is my for-loop to loop through the columns
for (i in col) {
  gapfilling(df_a, i)
}
require(输入)
#一些测试数据
上校
  • 如果没有
    for循环
    ,我如何实现这一点?据我所知,如果可能的话,你应该避免循环的
    ,我确信这在我的情况下是可能的,我只是不知道怎么做
  • 对于循环
    ,您绝对不必避免使用
    。您应该避免使用循环来执行可以矢量化的操作。循环一般来说很好,但是与编译语言(如)相比,它们(要慢得多),但与语言(如)中的循环相当

  • 我的for循环可以工作,但它不会覆盖
    data.frame
    。为什么?
  • 这是一个覆盖函数中的值的问题,或者称为。基本上,任何分配都仅限于其当前环境(或范围)。以下面的例子为例:

    f <- function(x){
        a <- x
        cat("a is equal to ", a, "\n")
        return(3)
    }
    x <- 4
    f(x)
    a is equal to  4 
    [1] 3
    print(a)
    
    现在为了可读性(而不是速度),可以将其更改为
    lappy

    df_a[, col] <- lapply(df_a[, col], na_kalman)
    

    df_a[,col]非常感谢您花时间解释R中的basic。我喜欢
    lappy
    方法,因为它的可读性。是否也可以将我的间隙填充功能与
    lappy
    结合使用?我不明白如何将维度以正确的顺序传递给函数,互联网上的基本
    apply
    教程对此没有帮助。没问题。在大多数情况下,简单地更改函数是一个问题,因此输入是单个列,而不是带有和索引的整个
    data.frame
    <代码>间隙填充注:在后一种情况下,我的最后一个编码示例是
    df_a[,col]
    
    df_a[, col] <- lapply(df_a[, col], na_kalman)