【发布时间】: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