2016-04-28 50 views
-1

我需要将转换应用于大型数据框的所有数值变量。数据框也有其他类型的变量。我最初的想法是遍历所有列,检查它们是否数值,然后通过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) 
  • 测试是一个数据框,但转换是没有发生。我在哪里犯错?
  • 作为一个额外的,我也想transformDivideThousand有一个可选的参数,我可以传递一个列表的名称为变量使用,如果是空的,比迭代所有的。
+5

您必须将结果重新分配到循环中。 'data_frame [[I]] < - data_frame [[I]]/1000'。使用双方括号来提取一列;你应该学习'['和'[[''的区别。例如,'is.numeric(data_frame [i])'几乎不会返回'TRUE'。此外,循环没有正确定义;应该是'for(i in 1:ncol(data_frame))',否则只考虑最后一列。 – nicola

回答

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) 
} 
相关问题