2016-10-13 2 views
1

Предположим, что набор данных, в котором 10 участников заполнили анкету с тремя элементами, x, y и z.R: apply() function in with() function

ss <- data.frame(x=rnorm(10), y=rnorm(10), z=rnorm(10)) 

Я хочу вычислить среднее значение этих предметов для каждого человека (личное значение). я могу легко сделать это таким образом:

ss$personalmean <- rowMeans(ss[c("x", "y", "z")]) 

или так:

ss$personalmean <- apply(ss[c("x", "y", "z")], 1, mean) 

Но предположим, что я хочу быть в состоянии сделать это в с функцией. Тогда я сталкиваюсь с проблемами.

Это работает:

with(ss, (x+y+z)/3) 

Но это не делает:

with(ss, rowMeans(c(x,y,z))) 
with(ss, apply(c(x,y,z), 1, mean)) 

Я не понимаю, почему. Пример здесь тривиален, но, короче говоря, я хотел бы использовать функцию apply() в функции with().

Извините, если кто-то опубликовал хороший ответ на этот вопрос где-то, но поиск в googling, что я ищу, нелегко, учитывая, что «с» - довольно общий термин.

+1

Оба 'apply' и' rowMeans' работу над матрицами. Является ли 'c (x, y, z)' похожим на матрицу? – Frank

+3

Вам нужно 'cbind' вместо' c' – akrun

+0

@akrun, спасибо за этот ответ. Не могли бы вы принять его в качестве ответа, чтобы я мог его принять. – msoftrain

ответ

2

Как @Frank, упомянутые в комментариях, apply и rowMeans работают с матрицей/data.frame. Таким образом, если мы хотим использовать with, вместо c, cbind преобразует его в matrix,

with(ss, rowMeans(cbind(x,y,z))) 
with(ss, apply(cbind(x,y,z), 1, mean))