【问题标题】:writing functions for manipulating dataframes in R在 R 中编写用于操作数据帧的函数
【发布时间】:2016-06-07 19:00:50
【问题描述】:

在使用 IgorPro 多年后,我刚刚开始使用 R 进行数据操作和分析,没有人会像我一样花这么多时间编写脚本。不过,这两者之间显然存在概念上的脱节,这给我带来了麻烦。

我想编写一个函数,它将获取数据框中的任何列,并将其从 0 缩放到 1。这里的关键是我希望重新缩放的数据在数据框中结束。在我的 IgorPro 思维框架中,这很容易:

normalize<-function(col){
   col<-col/min(col)
}

如果我输入testdf$testcol 并打印结果,这已经奏效,但结果并未合并到数据框中。一点研究表明,这是因为我的函数存在于本地环境中,为了修改本地环境之外的东西,它需要连接到全局环境。

修改:

normalize<-function(col){
  col<-col/min(col)
  assign("col",col,envir=.GlobalEnv)
}

当然,这只是吐出一个名为col 的新向量,并不能帮助我覆盖未缩放的数据。

没有将列名重新分配给重新缩放的数据,这违背了编写函数来执行此操作的意义,我如何使用函数中的参数将函数输出分配给实际的数据帧?

最后说明:我很感激任何涉及使用包的输入,但我有更多的数据操作要做,我希望能够编写自己的函数,而不是必须找到包所有东西,所以如果你能帮助我理解如何自己编写函数而不是指向其他地方的内置函数,那么加分。

【问题讨论】:

  • 您可以将整个数据框和列索引(或名称)传递给函数,并执行计算
  • 您的 normalize 函数不会将您的数据缩放到 [0,1],而是缩放到 [1, infinity]
  • 您似乎对传递引用语义与传递值感到困惑。 R does not pass-by-reference
  • 使用最小值而不是最大值,因为我使用的仪器将所有数据任意吐出为负值,所以我同时翻转和重新缩放。

标签: r


【解决方案1】:

另一种流行的方法是使用dplyr 包:

df <- df %>% mutate(col = col / min(col)

将替换数据帧df 中的col。另一个(基本 R)选项是使用 transform:

df <- transform(df, col = col / min(col))

虽然这主要用于交互使用,但不建议在函数中使用。

【讨论】:

    【解决方案2】:

    这是一种典型的基本 R 方法,用于将函数应用于数据集的多个列。假设您有一个 data.frame df,并且您想要缩放所有向量:

    normalize <- function(x) x / min(x)
    

    现在使用lapply 运行您的data.frame:

    df[] <- lapply(df, normalize)
    

    请注意,您需要 [] 来维护 data.frame 结构。现在,假设你有一些你不想接触的分类变量

    df[, sapply(df, is.numeric)] <- lapply(df[, sapply(df, is.numeric)], normalize)
    

    或者将该函数应用于一组选定的变量:

    df[, c("var1", "var2", "var5")] <- lapply(df[, c("var1", "var2", "var5")], normalize)
    

    可能值得一试的流行包是data.table。对于许多任务,它可能比基本 R 快很多。

    这是在data.table 中执行此操作的一种方法:

    library(data.table)
    setDT(df)
    
    df[, names(df) := lapply(.SD, normalize)]
    

    【讨论】:

      【解决方案3】:

      关于如何标准化列,所有其他答案都是正确的,但除了在这种情况下您想要做什么的特定解决方案之外,还有一些您真正需要知道的事情。

      为什么你的代码不起作用的基本答案是你没有返回你在函数内部操作的对象。

      normalize<-function(col){
        col<-col/min(col)
        return(col)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多