如何将数据帧切片传递给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列并给出一个值。
感谢您的帮助!
答
在你的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
你的函数'Mode'不返回任何东西;你应该在结束函数之前添加'return()'和你感兴趣的值。 – R18