【问题标题】:How to rename column names by using an alias/synonym dictionary in R?如何使用 R 中的别名/同义词字典重命名列名?
【发布时间】:2020-03-18 21:37:34
【问题描述】:

我在这个很棒的网站上阅读了很多,但这实际上是我的第一个问题。所以请耐心等待!

我是一名博士生,研究来自不同科学家的生态数据(不同地区的物种丰度数据)。我想改进我的数据管理并停止手动编辑我的原始数据,而是使用脚本进行所有更改。物种的分类可能是一团糟,这意味着:同一物种的不同同义词或别名。此外,由于我使用来自不同科学家的数据,我必须处理不同的物种缩写、不同的列顺序以及拼写错误。你给它命名。我现在想知道是否有一种使用别名/同义词字典重命名列名的好方法。我花了几个小时研究,但找不到真正适合我的问题的答案。

这是我的数据的一个小例子:

df1 <- tibble(depth_cm = c(1.5:4.5), n_pachyderma_d = c(70.2:73.2), n_pachyderma_s = c(10.1:13.1), g_quinqueloba = c(2.4:5.4))
dict <- tibble(new_name = c("turborotalita_quinqueloba", "neogloboquadrina_incompta", "neogloboquadrina_pachyderma"),  alias1 = c("t_quinqueloba", "neogloboquadrina_pachyderma_dextral", "globigerina_pachyderma"), alias2 = c("g_quinqueloba", "n_pachyderma_d", "n_pachyderma_s"), alias3 = c(NA, "n_incompta", "n_pachyderma"))

df1 是我的实际原始数据表,其中包含不同物种的深度值和丰度。

> df1
# A tibble: 4 x 4
  depth_cm n_pachyderma_d n_pachyderma_s g_quinqueloba
     <dbl>          <dbl>          <dbl>         <dbl>
1      1.5           70.2           10.1           2.4
2      2.5           71.2           11.1           3.4
3      3.5           72.2           12.1           4.4
4      4.5           73.2           13.1           5.4 

dict 是我想要使用的字典。请注意,特定物种可能有不同数量的别名。我想在遇到新别名时立即用新别名更新这本字典。

> dict
# A tibble: 3 x 4
  new_name                    alias1                              alias2         alias3      
  <chr>                       <chr>                               <chr>          <chr>       
1 turborotalita_quinqueloba   t_quinqueloba                       g_quinqueloba  NA          
2 neogloboquadrina_incompta   neogloboquadrina_pachyderma_dextral n_pachyderma_d n_incompta  
3 neogloboquadrina_pachyderma globigerina_pachyderma              n_pachyderma_s n_pachyderma

我现在想通过在 dict 中查找列名,用 new_name 重命名 df1 的物种列名。但是,由于我仍在学习 R,所以我不知道如何解决这个问题。但基本上,我想用字典检查每个列名,然后用正确的物种名称重命名列。有没有聪明的方法呢?我的主要目标是自动化不同数据集的导入和标准化。

我真的很期待每一个建议或帮助!

【问题讨论】:

    标签: r dictionary tibble


    【解决方案1】:

    我们可以将 'dict' 重塑为 'long' 格式

    library(dplyr)
    library(tidyr)
    new_dict <- dict %>%
          pivot_longer(cols = starts_with('alias')) %>%
          filter(value %in% names(df1)) %>% 
          select(-name)
    

    并使用它来重命名“df1”中的列

    df2 <- df1 %>% 
              rename_at(vars(new_dict$value), ~ new_dict$new_name)
    
    df2
    # A tibble: 4 x 4
    #  depth_cm neogloboquadrina_incompta neogloboquadrina_pachyderma turborotalita_quinqueloba
    #     <dbl>                     <dbl>                       <dbl>                     <dbl>
    #1      1.5                      70.2                        10.1                       2.4
    #2      2.5                      71.2                        11.1                       3.4
    #3      3.5                      72.2                        12.1                       4.4
    #4      4.5                      73.2                        13.1                       5.4
    

    【讨论】:

    • 老实说,这是一个荒谬的快速回答。此外,超短并且它(至少)适用于我的示例。非常感谢!但是,我现在太累了,无法用我的真实数据完全理解和测试这种方法。明天会这样做。 :) 谢谢!
    • @schnurstracks 感谢您的回复。如果需要任何更改,请告诉我
    猜你喜欢
    • 2022-08-17
    • 2021-08-02
    • 1970-01-01
    • 2023-04-02
    • 2018-07-16
    • 2016-08-23
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多