2016-06-07 89 views
0

我刚刚开始与R一起使用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新载体,并不能帮助我在我的工作将覆盖非扩展数据,但是。

将列名称重新分配给重新调整的数据(这违背了编写函数来完成此操作)的问题,我如何使用函数中的参数将函数输出分配给实际的数据框?

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

+0

你可以传递整个数据帧和列索引(或名称)的功能,并执行计算 – Barranka

+1

你'normalize'功能不会将您的数据扩展到[0,1],而是[1,infinity] –

+0

您似乎对传递引用语义与传值有点混淆。 [R没有通过引用传递](http://stackoverflow.com/questions/2603184/r-pass-by-reference) –

回答

2

另一种流行的做法是使用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)] 
2

所有其他答案都对如何标准化列做了正确的描述,但这里有一些你确实需要知道的东西,超出了你想要在这种情况下做什么的特定解决方案。

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

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