【问题标题】:How to subset or 'group' another subsets?如何对另一个子集进行子集化或“分组”?
【发布时间】:2019-12-02 19:08:27
【问题描述】:

我正在尝试对数据集(巴西的凶杀率)进行一些分析。数据很简单,但我正在学习,所以对我来说不是那么简单......在按年份、州和地区创建分组信息的子集之后,我仍然无法理解如何将这些子集分组为更大的子集(按地区划分的州) .我想将所有区域分组到一个更大的“子集”上,这样我就可以绘制信息,而不是让数据按状态显示,而是按区域显示。这可能既简单又愚蠢,但我浪费了几个小时谷歌搜索和尝试不同的代码,到目前为止没有任何效果。

North <- subset(Homicides, State == 'AM' | State == 'RR'| State == 'AP' | State == 'PA' | State == 'TO' | State == 'RO' | State == 'AC')
Northeast <- subset(Homicides, State == 'MA' | State == 'PI'| State == 'CE' | State == 'RN' | State == 'PE' | State == 'PB' | State == 'SE' | State == 'AL' | State == 'BA')
Midwest <- subset(Homicides, State == 'MT' | State == 'MS'| State == 'GO'| State == 'DF')
Southeast <- subset(Homicides, State == 'SP' | State == 'RJ'| State == 'ES'| State == 'MG')
South <- subset(Homicides, State == 'PR' | State == 'RS'| State == 'SC')
AllRegions <- # How to group them so I can plot correctly?

对于情节代码:

ggplot(Homicides, aes(x = Year, y = TotalRate, group = State, color = State)) + # Where state should be the regions instead
  geom_line() +
  geom_point(size = 1) + 
  ggtitle("Total Homicides") +
  theme_hc() +
  scale_colour_hc()

数据集文件的样子(便于理解)

    State Year TotalRate FirearmsRate
1      AC 1979        34           13
2      AC 1980        26           12
3      AC 1981        28            8
4      AC 1982        41           18
5      AC 1983        33           12
6      AC 1984        36           13

【问题讨论】:

  • 欢迎来到 SO。通过发布dput(Homicides) 的输出或者如果输出真的很长dput(head(Homicides),帮助我们帮助您。我认为您可以通过使用mutatecase_when 的某种组合创建一个新列来解决这个问题。
  • 所以你想有 x 个地块,其中 x 等于区域数?每个图只包含每个区域的状态子集?如果是,我认为ggplot2::facet_wrap 可能会有所帮助。相反,如果您只对在一张图中绘制区域感兴趣,我认为您应该首先按区域汇总数据;然后您可以按地区绘制一些汇总统计数据。
  • @GiovanniColitti 基本上我想要一个按地区而不是按州提供信息的单一情节。例如:南部地区包括 RS、SC 和 PR 州。如果我绘制所有状态,它很难阅读,信息太多......
  • @BenG 输出头低于&gt; dput(head(Homicides)) structure(list(State = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS", "MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC", "SE", "SP", "TO"), class = "factor"), Year = 1979:1984, TotalRate = c(34L, 26L, 28L, 41L, 33L, 36L), FirearmsRate = c(13L, 12L, 8L, 18L, 12L, 13L)), row.names = c(NA, 6L), class = "data.frame")的结果@

标签: r ggplot2 dplyr grouping


【解决方案1】:

正如@Giovanni 所说,按地区汇总数据是这里的关键。这是我认为使用dplyr 包解决的典型问题,它是tidyverse 的一部分

您提供的示例数据没有回答问题所需的所有组成部分,因此我将其更改为包含多个州,并且每个州的年份都相同:

df <- read.table(header = TRUE, text ="
State Year TotalRate FirearmsRate
AC    1979        34           13
AM    1980        26           12
MA    1979        28            8
PI    1980        41           18
MT    1979        33           12
MS    1980        36           13")

然后我将您的标准应用于新列:

df_summary <- df %>%
 mutate(region = case_when(
         State == 'AM' | State == "AC" ~ "North",
         State == "MA" | State == "PI" ~ "Northeast",
         State == "MT" | State == "MS" ~ "Midwest")) %>%
 group_by(region, Year) %>%
 summarize(average_rate = mean(TotalRate))

# which looks like this

# A tibble: 6 x 3
# Groups:   region [3]
  region     Year average_rate
  <chr>     <int>        <dbl>
1 Midwest    1979           33
2 Midwest    1980           36
3 North      1979           34
4 North      1980           26
5 Northeast  1979           28
6 Northeast  1980           41

然后你可以在你的ggplot 中使用它(我没有使用你的主题元素,因为我不确定它们来自哪里:

ggplot(df_summary, aes(x = Year, y = average_rate, color = region)) +
  geom_line() +
  geom_point(size = 1) + 
  ggtitle("Total Homicides")

【讨论】:

  • 哦,哇,这正是我想要做的。你帮了我很多,对你来说可能是小菜一碟,但在这里拯救了我的一天。感谢您抽出宝贵时间!
  • 没问题,对于以后的问题,请按照此处的指导:stackoverflow.com/questions/5963269/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2014-11-17
  • 1970-01-01
  • 2018-02-01
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多