【问题标题】:Date missing in table after summarizing different column汇总不同列后表中缺少日期
【发布时间】:2019-11-19 15:06:50
【问题描述】:

在 RStudio 中,我有以下代码:

install(ggplot2)
install(dplyr)
Data is *gapminder_data.csv*

*str(gapminder_data.csv)*
'data.frame':   1704 obs. of  6 variables:
 $ country  : Factor w/ 142 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ year     : int  1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
 $ pop      : num  8425333 9240934 10267083 11537966 13079460 ...
 $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ lifeExp  : num  28.8 30.3 32 34 36.1 ...
 $ gdpPercap: num  779 821 853 836 740 ...

当我执行以下代码时:

gapminder_data.csv  %>% 
  group_by(country) %>%
  summarize(min(gdpPercap), max(gdpPercap))

有效:

# A tibble: 142 x 3
   country     `min(gdpPercap)` `max(gdpPercap)`
   <fct>                  <dbl>            <dbl>
 1 Afghanistan             635.             978.
 2 Albania                1601.            5937.
 3 Algeria                2449.            6223.
 4 Angola                 2277.            5523.
 5 Argentina              5911.           12779.
 6 Australia             10040.           34435.
 7 Austria                6137.           36126.
 8 Bahrain                9867.           29796.
 9 Bangladesh              630.            1391.
10 Belgium                8343.           33693.

但是,我错过了值的相应年份:

min(gdpPercap)   max(gdpPercap)

我该如何解决? 感谢您的帮助。

【问题讨论】:

  • 我不完全理解这个问题,因为你没有做任何可以识别相应年份的事情。您的措辞好像应该跟踪具有最小和最大 GDP 的年份,但它们不会
  • 当您分组然后汇总时,它会删除该分组未使用的列并汇总。在这种情况下,由于您没有在您的组或汇总中包含年份列,因此它将它们从您的数据集中删除。我会尝试gapminder_data.csv %&gt;% group_by(country, year) %&gt;% summarize(min(gdpPercap), max(gdpPercap))
  • @HanselPalencia ,我认为这不是 OP 想要的 - 他们想要 gdppercap 为最小值/最大值的年份的值。 year[gdpPercap==min(gdpPercap) 之类的东西(虽然我不确定这是否适用于汇总 - 可能需要单独的 left_join)。
  • 您好,感谢大家的快速答复。如果我在 group_by 中添加“年份” - 这也是我的第一个想法 - 结果是:1 阿富汗 1952 779. 779. 2 阿富汗 1957 821. 821. 3 阿富汗 1962 853. 853. 等等...我想要 1 分钟& 每个国家最多 1 个。缺少这些值的年份。

标签: r date dplyr missing-data


【解决方案1】:

这能满足你的需要吗?

mins <- gapminder_data.csv %>%
  arrange(gdpPercap) %>%
  group_by(country) %>%
  slice(1) %>%
  ungroup()
maxs <- gapminder_data.csv %>%
  arrange(desc(gdpPercap)) %>%
  group_by(country) %>%
  slice(1) %>%
  ungroup()

left_join(
  select(mins, country, minyear=year, mingdp=gdpPercap), 
  select(maxs, country, maxyear=year, maxgdp=gdpPercap),
  by = "country")
# # A tibble: 142 x 5
#    country     minyear mingdp maxyear maxgdp
#    <chr>         <dbl>  <dbl>   <dbl>  <dbl>
#  1 Afghanistan    1997   635.    1982   978.
#  2 Albania        1952  1601.    2007  5937.
#  3 Algeria        1952  2449.    2007  6223.
#  4 Angola         1997  2277.    1967  5523.
#  5 Argentina      1952  5911.    2007 12779.
#  6 Australia      1952 10040.    2007 34435.
#  7 Austria        1952  6137.    2007 36126.
#  8 Bahrain        1952  9867.    2007 29796.
#  9 Bangladesh     1972   630.    2007  1391.
# 10 Belgium        1952  8343.    2007 33693.
# # ... with 132 more rows

【讨论】:

    【解决方案2】:

    我们可以很容易地用一个支点来做到这一点。由于您没有发布我们可以复制和粘贴的结构(总是有帮助的!),我制作了一个小样本小标题,但它应该适用于您更大的集合。按国家分组后,制作一列来指定最大和最小行。我们不想要那些也不是的,所以放弃那些并最终传播这些值,以使每个国家的最大值和最小值都有一个广泛的标题。通常,最好在 R 中使用整洁(长格式)的 tibbles(它在枢轴之前的状态),但如果需要,您可以通过使用 pivot_longer 轻松回到那里。

    tibble(
      country = rep("Afghanistan",4),
      year = seq(from = 1952, to = 1955),
      gdpPercap = c(779, 821, 853, 836)
    ) %>% 
      group_by(country) %>% 
      mutate(
        type = case_when(
          gdpPercap == max(gdpPercap) ~ "max",
          gdpPercap == min(gdpPercap) ~ "min"
        )
      ) %>% 
      drop_na() %>% 
      pivot_wider(
        id_cols = country,
        names_from = type,
        values_from = c(year, gdpPercap)
      )
    

    产生:

    # A tibble: 1 x 5
    # Groups:   country [1]
      country     year_min year_max gdpPercap_min gdpPercap_max
      <chr>          <int>    <int>         <dbl>         <dbl>
    1 Afghanistan     1952     1954           779           853
    

    【讨论】:

    • 您好,GenesRus,您的解决方案强制先验地选择一个国家,例如“阿富汗”。这是部分解决方案。感谢您的努力。马尔克利
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2021-01-16
    相关资源
    最近更新 更多