[英]writing functions for manipulating dataframes in 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
的新向量col
並且對我覆蓋非縮放數據的工作沒有幫助。
缺少將列名重新分配給重新縮放的數據的做法,這不符合編寫函數的目的,我如何使用函數中的參數將函數輸出分配給實際的數據幀?
最后說明:感謝所有涉及使用將為我完成此操作的軟件包的輸入,但是我還有很多數據操作要做,我希望能夠編寫自己的函數,而不必為所有內容查找軟件包,如果您能幫助我理解如何自己編寫函數,而不是將我指向其他地方的內置函數,則加分。
這是將函數應用於數據集的多個列的典型base 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
。 對於許多任務,它可能比base R快得多。
這是在data.table
執行此操作的一種方法:
library(data.table)
setDT(df)
df[, names(df) := lapply(.SD, normalize)]
另一種流行的方法是使用dplyr
軟件包:
df <- df %>% mutate(col = col / min(col)
將替換數據幀df
col
。 另一個(基於R的)選項是使用transform
:
df <- transform(df, col = col / min(col))
盡管這主要是用於交互使用,但不建議在功能中使用。
所有其他答案都很好地說明了如何對色譜柱進行標准化,但這是您真正需要了解的內容,除了針對這種情況下要執行的操作的特定解決方案。
為什么您的代碼不起作用的基本答案是,您沒有返回要在函數內部操作的對象。
normalize<-function(col){
col<-col/min(col)
return(col)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.