Ошибка R: Ошибка: `f` должен быть фактором (или символьным вектором) - PullRequest
0 голосов
/ 03 февраля 2019

Я получаю эту ошибку:

Error: `f` must be a factor (or character vector)

Вот код.

library(tidyverse)
library(scales)
theme_set(theme_light())

recent_grads <- read.csv("https://raw.githubusercontent.com/fivethirtyeight/data/master/college-majors/recent-grads.csv")
head(recent_grads)

# recent_grads <- read_csv("https://raw.githubusercontent.com/fivethirtyeight/data/master/college-majors/recent-grads.csv")
majors_processed <- recent_grads %>%
  arrange(desc(Median)) %>%
  mutate(Major = str_to_title(Major),
         Major = fct_reorder(Major, Median))


by_major_category <- majors_processed %>%
  filter(!is.na(Total)) %>%
  group_by(Major_category) %>%
  summarize(Men = sum(Men),
            Women = sum(Women),
            Total = sum(Total),
            MedianSalary = sum(as.numeric(Median * Sample_size)) / sum(Sample_size)) %>%
  mutate(ShareWomen = Women / Total) %>%
  arrange(desc(ShareWomen))



majors_processed %>%
  mutate(Major_category = fct_reorder(Major_category, Median)) %>%
  ggplot(aes(Major_category, Median, fill = Major_category)) +
  geom_boxplot()



majors_processed %>%
  arrange(desc(Total)) %>%
  head(20) %>%
  mutate(Major = fct_reorder(Major, Total)) %>%
  gather(Gender, Number, Men, Women) %>%
  ggplot(aes(Major, Number, fill = Gender)) +
  geom_col() +
  coord_flip()


library(ggrepel)
by_major_category %>%
  mutate(Major_category = fct_lump(by_major_category, 6)) %>%
  ggplot(aes(ShareWomen, MedianSalary, color = by_major_category)) +
  geom_point() +
  geom_smooth(method = "lm") +
  geom_text_repel(aes(label = by_mjor_category), force = .2) +
  expand_limits(y = 0)


library(plotly)
g <- majors_processed %>%
  mutate(Major_category = fct_lump(Major_category, 4)) %>%
  ggplot(aes(ShareWomen, Median, color = Major_category, size = Sample_size, label = Major)) +
  geom_point() +
  geom_smooth(aes(group = 1), method = "lm") +
  scale_x_continuous(labels = percent_format()) +
  scale_y_continuous(labels = dollar_format()) +
  expand_limits(y = 0)
ggplotly(g)


library(plotly)
g <- majors_processed %>%
  mutate(Major_category = fct_lump(Major_category, 4)) %>%
  ggplot(aes(ShareWomen, Median, color = Major_category, size = Sample_size, label = Major)) +
  geom_point() +
  geom_smooth(aes(group = 1), method = "lm") +
  scale_x_continuous(labels = percent_format()) +
  scale_y_continuous(labels = dollar_format()) +
  expand_limits(y = 0)
ggplotly(g)


library(broom)
majors_processed %>%
  select(Major, Major_category, Total, ShareWomen, Sample_size, Median) %>%
  add_count(Major_category) %>%
  filter(n >= 10) %>%
  nest(-Major_category) %>%
  mutate(model = map(data, ~ lm(Median ~ ShareWomen, data = ., weights = Sample_size)),
         tidied = map(model, tidy)) %>%
  unnest(tidied) %>%
  filter(term == "ShareWomen") %>%
  arrange(estimate) %>%
  mutate(fdr = p.adjust(p.value, method = "fdr"))

majors_processed %>%
  filter(Sample_size >= 100) %>%
  mutate(IQR = P75th - P25th) %>%
  arrange(desc(IQR))



majors_processed %>%
  ggplot(aes(Sample_size, Median)) +
  geom_point() +
  geom_text(aes(label = Major), check_overlap = TRUE, vjust = 1, hjust = 1) +
  scale_x_log10()

knitr::knit_exit()


# What were the most common *majors*? (Since there were 173, we're not going to show them all).
majors_processed %>%
  mutate(Major = fct_reorder(Major, Total)) %>%
  arrange(desc(Total)) %>%
  head(20) %>%
  ggplot(aes(Major, Total, fill = Major_category)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = comma_format()) +
  labs(x = "",
       y = "Total # of graduates")



majors_processed %>%
  group_by(Major_category) %>%
  summarize(Median = median(Median)) %>%
  mutate(Major_category = fct_reorder(Major_category, Median)) %>%
  ggplot(aes(Major_category, Median)) +
  geom_col() +
  scale_y_continuous(labels = dollar_format()) +
  coord_flip()


# What are the lowest earning majors?
majors_processed %>%
  filter(Sample_size >= 100) %>%
  tail(20) %>%
  ggplot(aes(Major, Median, color = Major_category)) +
  geom_point() +
  geom_errorbar(aes(ymin = P25th, ymax = P75th)) +
  expand_limits(y = 0) +
  coord_flip()

Может кто-нибудь сказать мне, что здесь не так?Я даже не вижу 'F' в коде.Я не вижу его как переменную или вообще что-либо.

Я следую приведенному здесь примеру.

https://github.com/dgrtwo/data-screencasts/blob/master/college-majors.Rmd

1 Ответ

0 голосов
/ 03 февраля 2019

Ваша первоначальная ошибка находится внутри функции fct_lump внутри mutate внутри фрагмента кода:

by_major_category %>%
  mutate(Major_category = fct_lump(by_major_category, 6)) %>%
  ggplot(aes(ShareWomen, MedianSalary, color = by_major_category)) +
  geom_point() +
  geom_smooth(method = "lm") +
  geom_text_repel(aes(label = by_major_category), force = .2) +
### Further, typo below
#  geom_text_repel(aes(label = by_mjor_category), force = .2) +
  expand_limits(y = 0)

Если вы проверяете fct_lump:

> mutate(Major_category = fct_lump(by_major_category, 6))
Error: `f` must be a factor (or character vector).
> fct_lump(by_major_category, 6)
Error: `f` must be a factor (or character vector).
> ?fct_lump
> # f: A factor (or character vector).
> class(by_major_category)
[1] "tbl_df"     "tbl"        "data.frame"

f - это первый параметр, передаваемый вашей функции fct_lump, и он сохраняется в by_major_category, но это не фактор или строка символов.

Быстрый поиск нужного кода, правильноеСформулированный кусок использует Major_category как f:

by_major_category %>%
  mutate(Major_category = fct_lump(Major_category, 6)) %>%
  ggplot(aes(ShareWomen, MedianSalary, color = Major_category)) +
  geom_point() +
  geom_smooth(method = "lm") +
  geom_text_repel(aes(label = Major_category), force = .2) +
  expand_limits(y = 0)

(Найден из исходного необработанного https://github.com/dgrtwo/data-screencasts/blob/master/college-majors.Rmd, которому ваш код пытается следовать, но отличается в нескольких важных местах)

Это дает ваш правильный сюжет.Другими словами, вы должны указывать на фактор в by_major_category$Major_category, а не на его родительскую структуру данных.

Вывод из опечатки в вашем фрагменте кода и нечетного knitr::knit_exit(), а также пропуск текста This is scrap work. из связанного источника, я предполагаю, что вы вручную печатаете код из скомпилированного документа knitr, такого как PDF, и ваши ошибки происходят из-за ручной вырезки-вставки / набора текста.Я предлагаю вам обратиться к оригинальному .Rmd-файлу, который обозначает R Markdown и, вероятно, в настоящее время используется как HTML / PDF / Word вместо необработанного источника R.

Вот рисунок с исправленным кодомчанк должен создать:

Corrected code chunk

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