【问题标题】:Renaming duplicated rows重命名重复的行
【发布时间】:2021-03-08 12:34:30
【问题描述】:

我有一个时间序列数据框,如下所示:

...
year    site
1987    ak12
1976    ak12
1766    ak13
1818    ak13
1987    ak12
2001    ak12
...

如您所见,有些站点名称是重复的(在本例中为 ak12)。我想将 ak12 的一个时间序列重命名为某个唯一名称(例如“ak12_a”),而不对行进行排序。像这样:

...
year    site
1987    ak12
1976    ak12
1766    ak13
1818    ak13
1987    ak12_a
2001    ak12_a
...

我知道make_unique 函数,但我不知道如何在这种情况下应用它,因为这些行无论如何都是重复的,因为它们跟在年份列之后。所以我需要一些代码,只要它“遇到”第二个副本,它就会重命名它的所有行。我该怎么做?

【问题讨论】:

  • 请显示最终结果应该是什么样子。现在还不清楚应该重命名哪个ak12。例如,是否应该在此之前按年份对行进行排序?
  • 感谢您的 cmets。我修改了帖子!希望没事!

标签: r


【解决方案1】:

这行得通吗:

library(dplyr)
library(stringr)
df %>% group_by(year) %>% mutate(site = case_when(duplicated(site) ~ str_c(site, '_a', sep = ''), TRUE ~ site))
# A tibble: 6 x 2
# Groups:   year [5]
   year site  
  <dbl> <chr> 
1  1987 ak12  
2  1976 ak12  
3  1766 ak13  
4  1818 ak13  
5  1987 ak12_a
6  2001 ak12  

使用的数据:

df
# A tibble: 6 x 2
   year site 
  <dbl> <chr>
1  1987 ak12 
2  1976 ak12 
3  1766 ak13 
4  1818 ak13 
5  1987 ak12 
6  2001 ak12 

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    df <- within(df, site <- ave(site, year, FUN = make.unique))
    

    输出

    > df
      year   site
    1 1987   ak12
    2 1976   ak12
    3 1766   ak13
    4 1818   ak13
    5 1987 ak12.1
    6 2001   ak12
    

    我使用的数据

    structure(list(year = c(1987L, 1976L, 1766L, 1818L, 1987L, 2001L
    ), site = c("ak12", "ak12", "ak13", "ak13", "ak12", "ak12")), class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      【解决方案3】:

      我建议创建一个嵌套的 for 循环,运行每个项目以检查重复项。

      count = 1 #for the duplicate count
      for(a in 'dataframe'){
          for(b in 2:'dataframe'){
              if (equal(a,b)) { #please check on this one, not sure about the command
                  b = paste(a,"_",count)
      }
      }
      }
      

      我在旅途中输入了这个,没有进行测试,但希望它对你有用。有问题请指出。

      【讨论】:

        【解决方案4】:

        data.table 的选项

        library(data.table)
         setDT(df)[, site := make.unique(site), year]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-17
          • 1970-01-01
          • 2012-12-28
          • 1970-01-01
          • 1970-01-01
          • 2018-03-04
          • 1970-01-01
          相关资源
          最近更新 更多