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"
)