R: стандартизировать с использованием функций среднего и стандартного отклонения.

Я пытаюсь сделать простое преобразование. Я использовал следующий код, и он работал нормально:

data_stdz <- transform(data_header, z.v1 = v1+2)

Но я не могу заставить работать следующий код:

data_stdz <- transform(data_header, z.v1 = (v1 - mean(v1))/(2*sd(v1))

Я также пытался заставить работать только среднюю функцию:

data_stdz <- transform(data_header, z.v1 = mean(v1)

Но я продолжаю получать следующую ошибку:

Error: unexpected symbol in:
"data_std2 <- transform(data_header, z.v1 = mean(v1)
data_std2"

Итак, я предполагаю, что это как-то связано с тем, как я использую функцию среднего и sd, но я не смог понять это.

Пример данных:

v1   v2  v3
6.7 3.8 1.2
6.3 3.2 1.2
6.1 2.6 1.6
7   2.4 1
NA  NA  NA
6.5 3.6 2.6
6.1 2.4 1.6
6   5.6 5.2
7   2.8 1
6.7 3.8 1.4
5.7 4.2 2.6
5.1 5.6 5
NA  NA  NA

person Tom    schedule 10.03.2012    source источник
comment
Эта ошибка не кричит мне сразу mean() или sd(). У вас отсутствуют закрывающие скобки в обоих вызовах transform(). Похоже, это и есть причина проблемы.   -  person Gavin Simpson    schedule 11.03.2012
comment
Спасибо за подсказку в скобках, Гэвин!   -  person Tom    schedule 11.03.2012
comment
Также стоит обратить внимание на функцию scale.   -  person Richie Cotton    schedule 11.03.2012


Ответы (2)


Ваша проблема, вероятно, (в дополнение к тому, что сказал Гэвин) в NA. Используйте na.rm=TRUE как в:

transform(data_header, z.v1 = (v1 - mean(v1, na.rm =T))/(2*sd(v1, na.rm =T)))
person Tyler Rinker    schedule 10.03.2012
comment
Взгляните и на предложение Дирка. Это может быть лучший подход к тому, что вы пытаетесь сделать. И Том, когда у вас возникают проблемы с функцией (не уверен, насколько вы новичок в R), используя ?function.name как в ?mean, дает вам хороший файл справки по функции, включая аргументы. Во многих случаях неправильная спецификация аргумента приводит к ошибкам. - person Tyler Rinker; 11.03.2012
comment
Очень новичок в R, но не новичок в двойных скобках. Спасибо за совет, когда я искал информацию о средней функции, и она не помогла, но ?mean есть. - person Tom; 11.03.2012

База R имеет для этой цели функцию scale().

person Dirk Eddelbuettel    schedule 10.03.2012
comment
В то время как мой ответ отвечает на непосредственные проблемы плаката, Диркс - гораздо лучший подход к тому, что вы пытаетесь сделать. scale имеет много других аргументов, которые делают его очень удобным для многих различных задач. - person Tyler Rinker; 11.03.2012
comment
Я рассматривал функцию scale(), но не знал, как с ее помощью вычислить 2*sd. - person Tom; 11.03.2012