R Сбой статистической функции с фреймами данных - PullRequest
0 голосов
/ 09 сентября 2018

При использовании функций mean (), sd () и т. Д. С фреймом данных я получаю сообщение об ошибке «аргумент не является числовым или логическим».

Я создал простой фрейм из двух векторов для проверки работоспособности (то есть для использования функции stat с фреймом данных).

str () дает следующее:

'data.frame':   195 obs. of  2 variables:
 $ Births  : num  10.2 35.3 46 12.9 11 ...
 $ Internet: num  78.9 5.9 19.1 57.2 88 ...

Использование функции mean ():

mean(frame2, na.rm=TRUE)

Дает:

Предупреждающее сообщение: В среднем по умолчанию (frame2, na.rm = TRUE): аргумент не является числовым или логическим: возвращение NA

Я видел предыдущий совет не использовать mean () с фреймом данных, что хорошо, но не в этом дело.

Я просматриваю поваренную книгу O'Reilly R, и в ней утверждается, что вы должны иметь возможность использовать mean () и sd () с фреймом данных.

Однако я не могу заставить его работать.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Два варианта, первый работает, если все столбцы действительно числовые, второй просто суммирует числовые столбцы:

dt %>% dplyr::summarise_all(mean)
dt %>% dplyr::summarise_if(is.numeric, mean)


  Births Internet
1  47.86    47.52
0 голосов
/ 09 сентября 2018

О вашей проблеме:

У меня нет доступа к вашей книге или другому учебному ресурсу, но лучшим инструментом обучения является R. help.Таким образом, чтобы понять тип аргументов, которые вы можете сделать ?mean, он говорит:

mean(x, trim = 0, na.rm = FALSE, ...)
Arguments

x   An R object. Currently there are methods for numeric/logical vectors and date, date-time and time interval objects. Complex vectors are allowed for trim = 0, only. 

Итак, как это объяснить, он работает лучше всего для vectors, также основанного на этом вопросе Я думаю, что ваша книга немного старая. Получите свою версию R и сравните ее с книгой.


Это хорошо работает для меня в этом примере:

dt<-data.frame(Births =sample(c(1:100),50),
           Internet =sample(c(1:100),50))

str(dt)
mean(dt$Births)

или даже если я сделаюданные как num все еще работают:

dt<-data.frame(Births =as.numeric( sample(c(1:100),50)),
           Internet =as.numeric(sample(c(1:100),50)))

str(dt)
mean(dt$Births)

, если вы хотите передать свой фрейм данных и получить общую информацию за один раз, вы можете использовать функцию summary:

summary(iris)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...