如何将数据帧切片传递给R中的模式归一化的直方图函数?

问题描述:

我想通过用户定义的规范化规范化数据框的选定列。到目前为止,我将与如何将数据帧切片传递给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

在你的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