【问题标题】:Adding values to a column based on number of rows根据行数向列添加值
【发布时间】:2021-04-15 15:20:08
【问题描述】:

我不太确定如何搜索此问题的答案,但我有一个显示这些地点被调查的地点和季节的 tibble。我需要添加一列,说明该位置是否是第一季、第二季、第三季等。每个地点都有不同的季节,这是第一季,所以我不能准确地将新专栏建立在年份上。季节也不一定是连续的。我觉得必须有一种方法可以计算一组行中的行数,然后为每个行分配不同的数字。

这是我的示例数据:

> forest <- c("bhd", "bhd", "bhd", "flh", "hlc", "hlc", "hlc", "llo", "llo")
> season <- c("2017-2018", "2016-2017", "2015-2016", "2018-2019", "2019-2020",
+             "2016-2017", "2017-2018", "2019-2020", "2017-2018")
> example <- tibble(forest = forest, season = season)
> example
# A tibble: 9 x 2
  forest season   
  <chr>  <chr>    
1 bhd    2017-2018
2 bhd    2016-2017
3 bhd    2015-2016
4 flh    2018-2019
5 hlc    2019-2020
6 hlc    2016-2017
7 hlc    2017-2018
8 llo    2019-2020
9 llo    2017-2018

我希望最终拥有什么:

# A tibble: 9 x 3
  forest season    rotation
  <chr>  <chr>     <chr>   
1 bhd    2017-2018 Third      
2 bhd    2016-2017 Second      
3 bhd    2015-2016 First      
4 flh    2018-2019 First      
5 hlc    2019-2020 Third      
6 hlc    2016-2017 First      
7 hlc    2017-2018 Second      
8 llo    2019-2020 Second      
9 llo    2017-2018 First

任何关于如何实现这一点的想法都会非常有帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以试试下面的代码

    example %>% 
      group_by(forest) %>% 
      mutate(rotation = rank(season))
    

    给了

      forest season    rotation
      <chr>  <chr>        <dbl>
    1 bhd    2017-2018        3
    2 bhd    2016-2017        2
    3 bhd    2015-2016        1
    4 flh    2018-2019        1
    5 hlc    2019-2020        3
    6 hlc    2016-2017        1
    7 hlc    2017-2018        2
    8 llo    2019-2020        2
    9 llo    2017-2018        1
    

    【讨论】:

    • 哇,这是一个如此简单的解决方案,我不确定我是怎么想到的。我认为我最好的选择是使用它,然后将mutate()case_when() 结合使用,如@TarJae 的回答所示
    • @Jordan ,你不需要案例。安装english 包后只需执行rotation = english::ordinal(rank(season))
    • 哦,完美!我从未听说过序数函数,这正是我所需要的!
    【解决方案2】:
    library(dplyr)
    example %>% 
      group_by(forest) %>% 
      dplyr::arrange(season, .by_group = TRUE) %>% 
      dplyr::mutate(rotation = row_number()) %>% 
      mutate(rotation = as.character(rotation)) %>% 
      mutate(rotation = case_when(rotation == 1 ~ "First",
                                  rotation == 2 ~ "Second",
                                  rotation == 3 ~ "Third",
                                  TRUE ~ rotation))
    

    输出:

    # Groups:   forest [4]
      forest season    rotation
      <chr>  <chr>     <chr>   
    1 bhd    2015-2016 First   
    2 bhd    2016-2017 Second  
    3 bhd    2017-2018 Third   
    4 flh    2018-2019 First   
    5 hlc    2016-2017 First   
    6 hlc    2017-2018 Second  
    7 hlc    2019-2020 Third   
    8 llo    2017-2018 First   
    9 llo    2019-2020 Second  
    

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多