首先,我想评论一下,我在提出问题之前进行了详尽的搜索,但没有获得令人满意的结果。我要使用的数据库名称很长且令人困惑,因此我想更改它们的名称但使用它们的位置。一些变量名称是:
[1] "Fecha"
[2] "Delegación"
[3] "Clave.INEGI.AGEE"
[4] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_.Producción"
[5] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Transporte"
[6] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Tráfico"
[7] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Comercio"
[8] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Suministro"
[9] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Posesión"
[10] "Código.Penal.Federal..CPF._Delitos.contra.la.salud_Otros"
使用 rename 更改名称很容易:
rename(nuevo_nombre = viejo_nombre)
当涉及到不那么长的名字时。然而,这种情况并非如此。现在我找到了如下解决方案:
rename(!!produccion := names[4], !!transporte:= names[5],
!!trafico :=names[6], !!comercio:= names[7], !!suministro := names[8],
!!posesion := names[9], !!otros:= names[10])
Error in quos(...) : objeto 'produccion' no encontrado
任何一个:
rename("produccion" = names[4], "transporte"= names[5],
"trafico" =names[6], "comercio"= names[7], "suministro" = names[8],
"posesion" = names[9], "otros"= names[10])
Error: Expressions are currently not supported in `rename()`
第二个显然意味着该格式在某些早期版本的 dplyr 中有效,但现在不是。我的问题是:是否不再可以使用rename
de按位置重命名变量dplyr
?有什么替代方案,特别是如果我想使用%>%
给定的运算符,因为它可以准确读取数据库的操作方式?
我感谢任何反馈和指导。
您是否尝试过使用与 关联的其他函数系列
rename
,例如rename_at
orrename_all
,它们可以接收函数(如 @mpaladino 推荐的函数)?该示例更具描述性:
我在解析调查数据库时经常遇到同样的问题:变量名就是问题,所以它们很长,中间有空格和特殊字符。不管 RStudio 有多么自动完成功能,一直重复它们真是太糟糕了。
这是一个有点长的答案,希望它会为您的案例和我们分享处理此问题的策略服务。
正如您提到
dplyr::rename()
的,它不适用于索引号。这部分与 Wickham 的哲学有关,该哲学更多来自于处理索引号没有位置的关系数据库,以及tidyverse
. 这些函数很容易使用:您不需要在字符串周围使用引号,也不需要使用它们显式创建数组c()
来进行多次调用,但由于这个原因,它们在函数参数中混合数字和字符串时遇到了麻烦。这就是为什么tidyverse
总是使用列名而几乎从不使用索引号的原因。select()
是一个例外。前言
首先,更一般的评论:我认为使用索引号进行子集化
data.frame
或重命名等操作不是一个好习惯。为什么?因为如果您的数据结构稳定并且索引号和名称始终匹配,则此方法有效。但是,如果您使用的是运算符%>%
您正在动态处理您的数据结构(在函数链中)。因此,您冒着这样的风险:当您消除一个变量时,以下变量的位置会少一个数字,如果您根据索引号应用更改,结果将不是您想要的。我对此有点夸张,尽管在某些情况下它的风险并不大,但我宁愿永远不要使用可能是不好的做法,“忘记”如何去做,而不是求助于另一个“捷径”有风险的上下文。首选选项:字典并使用短名称。
我使用的替代方法是为我的数据库列生成一组短名称,因此当我操作它们时,我用短名称来称呼它们。为此,如果它在我从中获取数据的源中可用,我会制作或导入一组
diccionario
变量。data.frame
一个至少有两列的简单,Variable
并且Etiqueta
.Variable
是短名称,我在数据操作期间用来指代该列,etiqueta
是我在图表或表格中使用的长且非常具有描述性的名称。如果需要,您可以在 Excel 或类似文件中构建它,将其导出为 .csv 并在您需要的 R 会话中导入它,或者直接在 R 中生成它。按照 R 环境中的约定,我总是称它为
diccionario
.在实践中,我将字典与两个简单的 ad hoc 函数一起使用:
nombrar_largo()
和nombrar_corto()
. 第一个负责进行匹配并将名称从短名称更改为长名称,第二个则相反。如所写,当列数不匹配时它们不会失败(即您可以在 a 之后使用它们select()
)并且如果有新列(保持不变)它们也不会失败,但它们确实需要其中列名的顺序x
和其中行的顺序df
等于。它们允许您使用短名称进行所有处理和操作,例如,当您想要生成长名称所在的图形时,您只需将它们添加
nombrar_largo() %>%
到函数链中的适当位置,这就是它。这是我正在使用的数据库的一个实际示例,您可以在此处下载:http: //portalanterior.ine.mx/archivos2/s/DECEYEC/EducacionCivica/Base_datos_Informe_Pais.xlsx
这些函数可以改进,因为它们需要一些固定的名称:字典、标签、变量,并且它们也存在顺序问题。然而,当他们工作时,我没有把手放在他们身上。对于非常广泛的基础,它们也有点慢,因为它
%in%
非常懒惰。但是由于它们可以满足我的需要,因此我还没有开始改进它们。具有功能的替代方法
nombrar()
如果做字典的工作量太大并且您更喜欢更快的解决方案(在短期内),您可以使用
setNames()
我称之为的函数的变体nombrar()
。setNames()
接受两个参数,一个data.frame
和一个名称向量,问题是它不能很好地处理索引号。所以我稍微修改了一下,让它接受第三个参数:一个带有索引的数字向量。我还更改了参数的顺序:第一个是data.frame
,所以使用%>%
lo 可以将其留空,第二个是带有索引的数字数组,第三个是字符数组,其中包含您喜欢的任何名称,用于按数字选择的变量。当然,对于每次使用,您都必须确保索引向量和名称向量具有相同的长度并按位置匹配。但是通过将 a 作为输入
data.frame
并返回与输出相同的结构,您可以将其与 operator 一起使用%>%
。选项 3:使用
gsub()
临时有时我们正在寻找的短名称是长而笨拙的名称,只需使用正则表达式或直接删除字符串即可。它可以用于您的数据库
gsub()
vector ,在这种情况下,我使用 setNames() 将过程包装在一个函数中。names()
在您的情况下,它将类似于:干杯!
通过一些旧的 R 笔记,我想出了一个答案,这可能对那些阅读这篇文章的人有用。解决方案是使用运算符
%>%
和基函数 R。我将使用基本 mtcars 来举例说明。
首先,让我们看一下数据库变量名称。
假设我对选择变量 mpg、cyl 和 hp 感兴趣(请记住,问题的本质是更改名称不是很简单的变量的名称,但无论如何它的工作方式相同)
可以看出,结果是期望的结果。
subset
这一切的症结在于使用setNames
哪些是R代码库函数。一个替代的解决方案,也相当有效。我希望有人觉得它有用。
使用该功能
colnames()
可以很容易地执行您所说的操作,例如,如果我的数据集的第一列我想被称为“日期”,则指令是colnames(data)[1]="Fecha"
1 表示它是您想要更改的第一列姓名