R 如何创建基于指定字典重命名列名的函数?

R 如何创建基于指定字典重命名列名的函数?,r,function,dictionary,dplyr,purrr,R,Function,Dictionary,Dplyr,Purrr,我正在创建一个数据分析包,它可以从各种来源获取数据。在许多情况下,列的名称在每个数据源上对相同类型的数据具有不一致的命名 在我的例子中,我希望创建一个重命名函数,调用格式化为tbl_df的字典,并重命名列 当所有原始列都有一个新列名时,此示例有效,但当tbl_df 库(tidyverse) df1错误:结果4必须是单个字符串,而不是长度为0的字符向量 由(v0.3.0)于2020-02-06创建 我相信我的重命名功能中有几项可以改进: 有没有更好的方法来调用正确的字典(tbl_df),而不是大

我正在创建一个数据分析包,它可以从各种来源获取数据。在许多情况下,列的名称在每个数据源上对相同类型的数据具有不一致的命名

在我的例子中,我希望创建一个重命名函数,调用格式化为
tbl_df
的字典,并重命名列

当所有原始列都有一个新列名时,此示例有效,但当
tbl_df

库(tidyverse)
df1错误:结果4必须是单个字符串,而不是长度为0的字符向量
由(v0.3.0)于2020-02-06创建

我相信我的重命名功能中有几项可以改进:

  • 有没有更好的方法来调用正确的字典(
    tbl_df
    ),而不是大量的
    if
    语句?我是否能够创建一个
    tbl_df
    csv
    ,其中包含一列
    数据源
    ,另一列列出包内
    tbl_df
    的名称
  • 当字典中的所有列都没有新名称时,如何重新运行函数以遵循类似的工作流,但不出现重命名错误
  • 对于我的用例,在
    r
    包中存储“字典”是否有更好的过程
    我认为您可以为所有导入的数据集使用一个字典。 一个技巧是使用
    重命名
    为新旧变量名使用命名向量。您仍然可以将字典放在
    tibble
    中,并使用
    tibble::deframe

    [注意,命名向量应该是
    c(new1=old1,new2=old2,…)

    库(tidyverse)
    #我们的字典
    字典#藏书:5 x 2
    #>新旧
    #>             
    #>1学生姓名
    #>2岁生日
    #>3高度
    #>4 ExamCore分数
    #>5年级
    #包含字典中不存在的列的数据
    数据#A tible:5 x 4
    #>姓名分数等级新值
    #>           
    #> 1  0.678 -0.431  0.753  1.43  
    #> 2  0.602 -0.532  1.15   0.356 
    #> 3  1.68   1.40   0.410  0.0729
    #> 4  0.817  1.84  -0.292  0.523 
    #> 5 -0.316  0.954 -1.02   1.16
    #获取字典中有新名称的数据变量名称
    变量在字典%tibble::deframe()中找到
    临时命令
    #>学生姓名ExamCore学校年级
    #>姓名“分数”等级
    #仅重命名这些变量
    数据%>%dplyr::重命名(!!临时命令)
    #>#A tibble:5 x 4
    #>学生姓名ExamCore小学新课程
    #>                        
    #> 1       0.678    -0.431       0.753  1.43  
    #> 2       0.602    -0.532       1.15   0.356 
    #> 3       1.68      1.40        0.410  0.0729
    #> 4       0.817     1.84       -0.292  0.523 
    #> 5      -0.316     0.954      -1.02   1.16
    
    由(v0.3.0)于2020年2月8日创建

    此外,在创建函数时,最好检查字典中是否没有匹配的变量名

    编辑

    因为你想选择字典

    库(tidyverse)
    人脉:2 x 2
    #>新旧
    #>          
    #>1 ExamCore分数
    #>二年级
    

    由(v0.3.0)于2020年2月8日创建

    我预见到的单个字典的问题实际上与大小有关。我的一些实际数据源有400多个列名。如果我只使用一个TIBLE,那么每次都会调用一个大尺寸的TIBLE。我理解。虽然大小为400 x2的TIBLE并不是真正的大尺寸。即使是1000x2。在任何情况下,你都可以使用一些字典并申请上面的代码为每个字典执行此操作还有一个问题。使用命名向量(即上面的)和重命名所有(~as.character(dictionary$new)[match(,dictionary$old)]之间有什么区别,或在每种方法中重命名?赞成或反对?我无法使您的代码正常工作,但我不会使用
    rename\u all
    ,因为它引用了所有变量。一种方法是使用
    rename\u at
    如下所示:
    vars\u to\u change
    
    tibble::tribble(
      ~data_source,    ~dictionary_name,
          "people", "people_dictionary",
            "test",   "test_dictionary"
      )