R错误:错误:`F`必须是一个系数(或字符向量)

问题描述 投票:-1回答:1

我得到这个错误:

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

r
1个回答
2
投票

你最初的错误就在于里面的代码块内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_categoryf

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降价,可能是目前您的使用视为在HTML / PDF / Word中,而不是原始R源之中。

下面是更正后的代码块应该创建人物:

Corrected code chunk

© www.soinside.com 2019 - 2024. All rights reserved.