Применить функцию к кадру данных, который использует средства столбцов (~ масштабирование Парето) - PullRequest
0 голосов
/ 27 сентября 2019

В кадре данных я хочу разделить каждое значение на квадратный корень стандартного отклонения значения столбца (~ масштабирование по Парето).Я взял код из существующего пакета (https://github.com/cran/RFmarkerDetector/blob/master/R/scaling.R)

paretoscale <- function(data) {
    # Here we perform centering
    x.centered <- apply(x, 2, function(x) x - mean(x))
    # Then we perform scaling on the mean-centered matrix
    x.sc <- apply(x.centered, 2, function(x) x/sqrt(sd(x)))
    x.sc <- cbind(sample_classes, x.sc)

Работает ли x.centered <- apply(x, 2, function(x) x - mean(x) x - mean(column where x is) как следует? Не могли бы вы объяснить, как это работает?

1 Ответ

0 голосов
/ 27 сентября 2019

Имена переменных могут быть немного непедагогическими, особенно для новичка.Перепишем часть apply, чтобы не вводить читателя в заблуждение.

paretoscale <- function(data) {
    # Here we perform centering
    x.centered <- apply(x, 2, function(col) col - mean(col))
    # Then we perform scaling on the mean-centered matrix
    x.sc <- apply(x.centered, 2, function(col) col/sqrt(sd(col)))
    x.sc <- cbind(sample_classes, x.sc)

Что делает apply(x, 2, function(col) col - mean(col)), так это то, что он работает на объекте x (data.frame или матрица) по столбцам.Для каждого столбца он находит свое среднее значение и вычитает его для каждого элемента.

Вот как apply работает по сравнению с циклом for.

xy <- data.frame(matrix(1:9, ncol = 3))

apply(X = xy, MARGIN = 2, FUN = function(col) col - mean(col))

     X1 X2 X3
[1,] -1 -1 -1
[2,]  0  0  0
[3,]  1  1  1

# Create an empty object
newxy <- xy
newxy[] <- NA

# Work column-wise
for (i in 1:ncol(xy)) {
  col <- xy[, i]
  # Calculate mean and substract it from all elements of the column
  newxy[, i] <- col - mean(col)
}
newxy

  X1 X2 X3
1 -1 -1 -1
2  0  0  0
3  1  1  1
...