Почему функция 'nrow ()', похоже, не работает внутри функции 'summaze ()'? - PullRequest
0 голосов
/ 06 января 2020

См. Следующий код:

library(dslabs)
data(gapminder)
gapminder %>%
  filter(year %in% c(2010, 2015) & !is.na(population)) %>%
  group_by(year) %>%
  summarise(weight = nrow(population))

Почему выдается ошибка: « Столбец weight имеет неподдерживаемый тип NULL »?

nrow() принимает вектор в качестве аргумента, а здесь population - это вектор внутри summarise() функции. Итак, мне интересно, почему это не работает?

Примечание: Я знаю альтернативы nrow() здесь, и я не ищу альтернативные коды, которые бы работали. Мой вопрос носит концептуальный характер и конкретно относится к « Почему ».

Ответы [ 2 ]

1 голос
/ 06 января 2020

summarize требует, чтобы результаты его функций сводки имели результат длины 1 и допустимый тип столбца.

nrow, примененный к вектору, возвращает NULL, который имеет длину 0, class из NULL и type NULL, что не является допустимым типом столбца.

> x = 1:3
> nrow(x)
NULL
> length(nrow(x))
[1] 0
> class(nrow(x))
[1] "NULL"
> typeof(nrow(x))
[1] "NULL"
1 голос
/ 06 января 2020

Поскольку вы передаете nrow имени столбца, которое NULL. См. Например:

nrow(mtcars$mpg)
#NULL

nrow принимает кадр данных, а не вектор:

nrow(mtcars)
#[1] 32

Однако есть также функция NROW, которая принимает вектор, поэтому здесь вы вместо этого можно использовать:

library(dplyr)

gapminder %>%
  filter(year %in% c(2010, 2015) & !is.na(population)) %>%
  group_by(year) %>%
  summarise(weight = NROW(population))

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

gapminder %>%
  filter(year %in% c(2010, 2015) & !is.na(population)) %>%
  group_by(year) %>%
  summarise(weight =n())

# A tibble: 2 x 2
#   year weight
#  <int>  <int>
#1  2010    185
#2  2015    185

ИЛИ с count:

gapminder %>%
  filter(year %in% c(2010, 2015) & !is.na(population)) %>%
  count(year)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...