Стандартизируйте и масштабируйте каждый столбец каждого элемента в списке

У меня есть список из 5 кадров данных, например:

mydf <- data.frame(x=c(1:5), y=c(21:25),z=rnorm(1:5), p=rnorm(2:6), f=rnorm(3:7))
mylist <- rep(list(mydf),5)
names(mylist) <-c("2006-01-01","2006-01-02","2006-01-03","2006-01-04","2006-01-05") 

У меня также есть трехэтапная формула и следующие фрагменты кода, которые я собрал:

введите здесь описание изображения

Шаг 1 - код для этого выглядит следующим образом, его необходимо рассчитать для каждой строки одного и того же столбца. если x является элементом "z", "f" или "p", то:

z = x - mean(column))/sd(column)

2 - перемасштабировать z-значения с 0, используя значения из шага 1.

rz = abs(min(z)) + z

3 - Перемасштабируйте оценки RZ с шага 2 так, чтобы они находились между 0 и 1.

mrz = rz/max(rz)

Мне нужно применить эту формулу только к столбцам "z", "p", "f", а также objective_col <- colnames(mylist$'2006-01-05'[,3:5]) к каждому элементу mylist, используя apply , sapply, lapply или другой тип цикла:

это, вероятно, будет выглядеть примерно так:

lapply(mylist, FUN = function(x) .......)

Выходные данные должны быть в том же макете и формате, что и mydf, и все они хранятся в mylist2 <- list().

Я буду продолжать обновлять это, поскольку я делаю больше прогресса. Я все еще учусь использовать циклы и функции. Спасибо всем, кто может внести свой вклад.


person Alex Bădoi    schedule 24.08.2015    source источник
comment
Как вы определяете строки z, p, f? Я вижу только столбцы. У вас есть другая переменная, которая определяет эти подмножества, или это просто опечатка?   -  person Alex W    schedule 25.08.2015
comment
это была опечатка. ушел сейчас.   -  person Alex Bădoi    schedule 25.08.2015


Ответы (1)


person    schedule
comment
Вы должны иметь возможность использовать lapply вместо apply(...,2,FUN) - person thelatemail; 25.08.2015
comment
конечно, либо работает... lapply(x[[c("z", "p", "f")]], function(y) ... как указано выше - person Alex W; 25.08.2015
comment
Я также рассмотрел функцию «масштаб» ранее. представляет ли он точно (x-μ)/σ ? формула не была показана в документации, поэтому я решил, что выберу более безопасный маршрут. Спасибо вам за помощь. выглядит отлично. - person Alex Bădoi; 25.08.2015
comment
ну, технически \mu и \sigma - неизвестные параметры. Если вы знаете их значения (от населения), вы можете их использовать. scale() использует MLE для \mu, \sigma (т.е. выборочное среднее и выборочное стандартное отклонение. - person Alex W; 25.08.2015
comment
@AlexBădoi - дает те же результаты - проверьте: all.equal(c(scale(1:10)),((1:10) - mean(1:10))/sd(1:10)) - person thelatemail; 25.08.2015
comment
@Alex, вы, кажется, включили последние 2 шага в одну строку, например return((y2 + abs(min(y2))) / max(y2)) . Последнее y2 -> max(y2) масштабируется с 0 в вашем коде? Последний шаг моей формулы использует перемасштабированные значения Z. правильно ли будет разделить на ((max(y2)+min(y2)) ? - person Alex Bădoi; 25.08.2015
comment
на самом деле ((max(y2)+min(y2)) вернет только max из y2, что является показателем z минус min. может разделить на max(y2 + abs(min(y2))) - person Alex Bădoi; 25.08.2015
comment
@AlexBădoi Я предлагаю вам пройти шаги по отдельности для одного столбца. Вам было бы полезно развить интуицию, чтобы понять, что делает код, не запуская его... вот как научиться - person Alex W; 25.08.2015