2016-06-07 78 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) 
}