如何 dplyr 按列索引重命名列?

2023-12-25

以下代码重命名数据集中的第一列:

require(dplyr)    
mtcars %>%
        setNames(c("RenamedColumn", names(.)[2:length(names(.))]))

期望的结果:

                    RenamedColumn cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4                    21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag                21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710                   22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1

使用以下方法是否可以得到相同的结果rename和列索引?


As of dplyr 0.7.5, rlang 0.2.1, tidyselect 0.2.4,这很简单:

library(dplyr)

rename(mtcars, ChangedNameAgain = 1)

#                     ChangedNameAgain cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4                       21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag                   21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710                      22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive                  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout               18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# ...

原始答案和编辑现已过时:

的逻辑rename() is new_name = old_name, so ChangedNameAgain = 1会比更有意义1 = ChangedNameAgain.

我会建议:

mtcars %>% rename_(ChangedNameAgain = names(.)[1])
#                     ChangedNameAgain cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4                       21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag                   21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710                      22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive                  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# Hornet Sportabout               18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# Valiant                         18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1

Edit

我还没有完全理解新的dplyr编程系统基于rlang,从 0.6/0.7 版本开始dplyr.

带下划线后缀的版本rename我最初的答案中使用的名称现已弃用,并且根据 @jzadra 的评论,它对于语法上有问题的名称(例如"foo bar".

这是我对新的尝试rlang基于非标准的评价体系。请毫不犹豫地在评论中告诉我我做错了什么:

df <- tibble("foo" = 1:2, "bar baz" = letters[1:2])

# # A tibble: 2 x 2
#     foo `bar baz`
#   <int>     <chr>
# 1     1         a
# 2     2         b

首先我直接尝试rename()但不幸的是我有一个错误。这似乎是一个FIXME https://github.com/tidyverse/dplyr/blob/1a0730a3bae22cd3ac1fbd491e6d4b9ab339ff75/R/select-vars.R#L213(或者这 FIXME 不相关吗?)在源代码中(我正在使用dplyr0.7.4),因此它可以在将来工作:

df %>% rename(qux = !! quo(names(.)[[2]]))

# Error: Expressions are currently not supported in `rename()`

(编辑:现在的错误消息(dplyr 0.7.5)读取Error in UseMethod("rename_") : no applicable method for 'rename_' applied to an object of class "function")

(2018年6月14日更新:df %>% rename(qux = !! quo(names(.)[[2]]))现在似乎可以工作,仍然使用 dplyr 0.7.5,不确定底层包是否更改)。

这是一个解决方法select这样可行。它不保留列顺序,例如rename though:

df %>% select(qux = !! quo(names(.)[[2]]), everything())

# # A tibble: 2 x 2
#     qux   foo
#   <chr> <int>
# 1     a     1
# 2     b     2

如果我们想将它放入一个函数中,我们必须稍微修改它:=允许在左侧取消引用。如果我们想要对字符串和裸变量名等输入具有鲁棒性,我们必须使用“黑暗魔法”(或者说vignette https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html) of enquo() and quo_name()(老实说我不完全明白它的作用):

rename_col_by_position <- function(df, position, new_name) {
  new_name <- enquo(new_name)
  new_name <- quo_name(new_name)
  select(df, !! new_name := !! quo(names(df)[[position]]), everything())
}

这适用于字符串形式的新名称:

rename_col_by_position(df, 2, "qux")

# # A tibble: 2 x 2
#     qux   foo
#   <chr> <int>
# 1     a     1
# 2     b     2

这适用于新名称作为限制:

rename_col_by_position(df, 2, quo(qux))

# # A tibble: 2 x 2
#     qux   foo
#   <chr> <int>
# 1     a     1
# 2     b     2

这适用于新名称作为裸名称:

rename_col_by_position(df, 2, qux)

# # A tibble: 2 x 2
#     qux   foo
#   <chr> <int>
# 1     a     1
# 2     b     2

即使这样也有效:

rename_col_by_position(df, 2, `qux quux`)

# # A tibble: 2 x 2
#   `qux quux`   foo
#        <chr> <int>
# 1          a     1
# 2          b     2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何 dplyr 按列索引重命名列? 的相关文章

随机推荐

  • 不同的闭包在快速保留周期中给出不同的结果

    我正在阅读 Apple 的 Swift 编程语言指南 在关于闭包的强引用循环的部分中 我尝试了一种不同类型的闭包 但它没有给出预期的输出 class HTMLElement let name String let text String l
  • scipy.io 的导入问题

    我一直在尝试开始使用 scipy 但该软件包给我带来了一些问题 本教程很大程度上依赖于 scipy io 但是当我导入 scypi 并尝试使用 scipy io 时 出现错误 In 1 import scipy In 2 help scip
  • 线程安全哈希映射?

    我正在编写一个应用程序 它将返回一个 HashMap 给用户 用户将获得此地图的参考 在后端 我将运行一些线程来更新地图 到目前为止我做了什么 我已经创建了所有后端线程 因此共享一个公共通道来更新 MAP 因此 在后端 我确信并发写入操作不
  • 在自动 Teams 消息中标记团队成员

    我有一个用于待命轮换的 Excel 电子表格 在 的帮助下这个答案 https stackoverflow com a 73039284 9124454 我能够使用 Power Automate 触发一条自动 Microsoft Teams
  • 使用 os.walk 时,有没有办法确定子目录是否位于 python 的同一文件系统中?

    我正在编写一个 python 脚本 它使用 os walk 来遍历目录树 我想赋予它跳过安装到不同文件系统的子目录的能力 这样find xdev做 检查 os walk 的文档 我没有看到任何参数可以让它自动执行此操作 我可以用什么东西来自
  • 片段测试错误:android.view.InflateException:二进制 XML 文件行 #16:二进制 XML 文件行 #16:错误膨胀类 <未知>

    我正在尝试按照以下说明测试片段 https developer android com training basics fragments testing https developer android com training basic
  • 仅将混合模式应用于投影

    可以混合吗only元素的投影与它重叠的元素的颜色 例如 我有一个元素与另一个元素重叠 顶部的元素有一个浅灰色的阴影 下面的元素是黑色的 我不希望对任何一个元素本身应用任何混合 但希望重叠元素 的投影与下面元素的颜色混合 在阴影落在重叠元素上
  • mysql 使用子查询更新查询

    谁能看出下面的查询有什么问题吗 当我运行它时 我得到 1064 你的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解要使用的正确语法 第 8 行的 a where a CompetitionID Competiti
  • 通用电子邮件验证器

    我想创建一个表单 用户将在其中输入他的电子邮件 我想验证客户端的电子邮件格式 Angular 2 中有通用的电子邮件验证器吗 注意 类似于AngularJS 验证器 https docs angularjs org api ng input
  • marklogic mlcp 自定义转换拆分聚合文档为多个文件

    我有一个 JSON 聚合 文件 我想使用 mlcp 将其拆分并作为多个文档摄取到 MarkLogic 中 我想要使用 javascript 在摄取过程中转换内容 http docs marklogic com guide mlcp impo
  • 同时声明多个变量的更优雅的方式

    要 同时 声明多个变量 我会这样做 a b True False 但如果我必须声明更多的变量 它就会变得越来越不优雅 a b c d e f g h i j True True True True True False True True
  • 如何以编程方式更改 Window 注册表中的值?

    我需要以编程方式将 HKEY CURRENT USER Software Intuit QBWebConnector 中找到的 Level 字符串更改为 Verbose 做这个的最好方式是什么 C bat 文件 我以前从来没有修改过注册表
  • GCM 的注册 ID 重复

    我们有一个使用 GCM 的应用程序 当用户首次打开应用程序时 应用程序会检查共享首选项以查看用户之前是否注册过 如果没有 则从 GCM 获取注册 ID 并将其存储到共享首选项中 还有一个存储用户 ID 和注册 ID 的第 3 方服务器 我阅
  • Javascript URL 深度(级别)

    是否可以使用 Javascript 获取 url 深度 级别 如果我有这个网址 www website com site product category item gt 深度 4 www website com site product
  • Spring Security 中的 beans.NotReadablePropertyException

    我对 Spring Security 非常陌生 我捡起来了this https rads stackoverflow com amzn click com 1847199747书并尝试执行代码 当我这样做时 我得到了 org springf
  • 如何读取 Objective-C 堆栈跟踪

    我有以下堆栈跟踪 0 MyApp 0x000833a3 TFCrashHandler backtrace 26 1 MyApp 0x000836bd TFSignalHandler 28 2 libsystem c dylib 0x33ea
  • 删除重复行并更新引用

    如何删除一个表中的重复行并将另一表中的引用更新为剩余行 重复仅出现在名称中 Id 列是标识列 Example 假设我们有两张表Doubles and Data Doubles table Id int Name varchar 50 Dat
  • 如何从嵌入式 HTML 与 Swift 进行通信以更改 bool

    您好 我想在执行 html 中的 onReady 块后更改绑定变量 click 的值 我可以使用评估java脚本从swift到html进行通信 但是我如何从 html 中的 onReady 与 swift 进行通信以更改 bools val
  • Chrome 扩展中的跨源 XMLHttpRequest

    根据 chrome 扩展 API 如果设置了权限 则应允许使用 XMLHttpRequest 对象进行跨源调用 只要扩展程序首先请求跨源权限 就可以与其源之外的远程服务器进行通信 我正在密切关注谷歌教程 http code google c
  • 如何 dplyr 按列索引重命名列?

    以下代码重命名数据集中的第一列 require dplyr mtcars gt setNames c RenamedColumn names 2 length names 期望的结果 RenamedColumn cyl disp hp dr