2017-10-18 139 views
0

我想通過用戶定義的規範化規範化數據框的選定列。到目前爲止,我將與如何將數據幀切片傳遞給R中的模式歸一化的直方圖函數?

library(tidyr) 
library(ggplot2) 

Mode <- function(x, na.rm = TRUE) { 
    x <- lapply(x, as.numeric) 
    distribution <- hist(x, breaks = 50, plot = FALSE) 
    distribution$mids[which.max(distribution$counts)] 
} 

data_normalised <- lapply(mtcars[,-9:-12], function(x) {(x-Mode(x))/(sd(x))}) 

作爲最小的例子。 但是,hist在抱怨「x必須是數字」。我認爲這可以通過鑄造

x <- lapply(x, as.numeric) 

不工作來解決。 我知道,HIST工程

hist(mtcars[[3]]) 

,但我不能找到一種方法,DF切片和HIST功能結合起來,作爲

hist(mtcars[[-9:-12]]) 

將無法​​正常工作eighter。

Idealy我想讓Mode()函數作爲sd()函數工作。拿一個df列並給出一個值。

感謝您的幫助!

+0

你的函數'Mode'不返回任何東西;你應該在結束函數之前添加'return()'和你感興趣的值。 – R18

回答

0

在你的Mode()功能class(x)'numeric'(即你有一個數字向量長度爲​​32)。然後,您使用lapply()將功能as.numeric()應用於x。這個步驟之後,class(x)'list'由於as.numeric是矢量化,你實際上並沒有遍歷向量的元素,而不是你可以在模式功能使用x <- as.numeric(x)

Mode <- function(x, na.rm = TRUE) { 
    x <- as.numeric(x) 
    distribution <- hist(x, breaks = 50, plot = FALSE) 
    distribution$mids[which.max(distribution$counts)] 
} 

進而你就可以作爲你這樣做,它不會產生錯誤:如果您想再次獲得data.frame

data_normalised <- lapply(mtcars[,-9:-12], function(x) {(x-Mode(x))/(sd(x))}) 

,您可以使用cbind()

data_normalised <- do.call("cbind", data_normalised) 

而你得到:

head(data_normalised) 
      mpg   cyl  disp   hp  drat   wt  qsec   vs 
[1,] 0.9540484 -1.09187321 0.6858229 0.03646289 1.54298263 -0.84827399 -0.35815351 -0.01984063 
[2,] 0.9540484 -1.09187321 0.6858229 0.03646289 1.54298263 -0.58765969 -0.04476919 -0.01984063 
[3,] 1.2527070 -2.21174317 0.2662607 -0.21148473 1.44946853 -1.15487905 0.84501845 1.96422286 
[4,] 1.0204170 -1.09187321 1.4765365 0.03646289 0.00935141 -0.24017396 1.30949879 1.96422286 
[5,] 0.5724290 0.02799675 2.2995240 0.98449790 0.14027115 -0.01022017 -0.04476919 -0.01984063 
[6,] 0.4728762 -1.09187321 1.2102758 -0.03646289 -0.58913882 0.01022017 1.74599838 1.96422286 
+0

工程優秀!謝謝!大概我不瞭解這裏的一些基本概念。我認爲拉比已經給出了一個數據框。 – Neudrino

相關問題