我刚刚开始与R合作,在使用IgorPro多年后进行数据处理和分析,没有一个人能够像我一样花费大量时间编写脚本。不过,两者之间显然存在概念上的脱节,这让我感到麻烦。
我想编写一个函数,它将采用我提供的数据帧中的任何列,并将其从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
的新向量,并没有帮助我努力覆盖非缩放数据。
如果没有将列名重新分配给重新调整的数据,这会使编写函数的操作失败,那么如何使用函数中的参数将函数输出分配给实际的数据帧呢?
最后说明:我感谢任何涉及使用可以为我执行此操作的程序包的输入,但我还有更多的数据操作要做,我希望能够编写自己的函数而不必查找如果你可以帮我理解如何自己编写函数而不是指向其他地方的内置函数,那么所有内容都会包含奖励积分。
答案 0 :(得分: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)]
答案 1 :(得分:2)
另一种流行的方法是使用dplyr
包:
df <- df %>% mutate(col = col / min(col)
将替换数据框col
中的df
。另一个(基础R)选项是使用transform
:
df <- transform(df, col = col / min(col))
虽然这主要用于交互式使用,但不建议在功能中使用。
答案 2 :(得分:2)
所有其他答案都是关于如何标准化列的正确答案,但除了在这种情况下您想要做的特定解决方案之外,这里有一些您真正需要知道的事情。
为什么你的代码不起作用的基本答案是你没有返回你在函数内操作的对象。
normalize<-function(col){
col<-col/min(col)
return(col)
}