使用函数转换数据框中的所有数值变量

时间:2016-04-28 05:35:08

标签: r

我需要将转换应用于大型数据帧的所有数值变量。数据框也包含其他类型的变量。我最初的想法是遍历所有列,检查它们是否为数字,然后将它们除以1000.

我在我的代码中遇到了一个函数,请点击这里的一些指示:

transformDivideThousand <- function(data_frame){
    for(i in ncol(data_frame)){
        if (is.numeric(data_frame[i])) {
            data_frame[i]/1000
        }
    }
    return(data_frame)
}

执行功能:

test <- transformDivideThousand(mypatients)
  • test是一个数据帧,但转换不会发生。我在哪里错了?
  • 作为额外的,我还希望transformDivideThousand有一个可选参数,我可以传递一个列表,其中包含要使用的变量的名称,如果为空,则迭代所有变量。

1 个答案:

答案 0 :(得分:4)

@ nicola的评论解释了你的循环出了什么问题。另一个选择是使用sapply来标识数字列,从而产生更简洁的代码。例如,使用内置的iris数据框:

iris[, sapply(iris, is.numeric)] = 
        iris[, sapply(iris, is.numeric)]/1000

您可以直接在数据框上运行它,如上所述,或将其放在函数中:

tDT <- function(data_frame) {

  data_frame[, sapply(data_frame, is.numeric)] = 
    data_frame[, sapply(data_frame, is.numeric)]/1000

  return(data_frame)

}

然后,运行它:

iris.new = tDT(iris)

为了将来参考,根据@ nicola的评论,这里是如何使for循环版本工作:

tDT2 <- function(data_frame) {

  for (i in 1:ncol(data_frame)) {
    if (is.numeric(data_frame[,i])) {
      data_frame[,i] = data_frame[,i]/1000
    }
  }
  return(data_frame)
}