簡體   English   中英

編寫用於在R中操縱數據幀的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM