如何在R管道的中间步骤访问并修改列名?
管道中修改列名的正确方法
你的问题出在管道内对set_names参数的写法上:names(~.)[-1]并不能获取管道传入数据的列名,因为~.是创建了一个公式对象,names(~.)返回的是".",所以c("person", names(~.)[-1])实际等价于c("person", character(0)),set_names会自动循环补齐这个向量,导致所有列名都变成了person。
以下是几种正确的实现方式:
方法1:直接用.指代管道传入的数据
library(dplyr) library(purrr) temp <- starwars[1:5,1:5] |> set_names(c("person", names(.)[-1]))
方法2:用dplyr的rename更直观(推荐)
如果只需要修改某一列的名字,rename比set_names更清晰,不需要处理全部列名:
temp <- starwars[1:5,1:5] |> rename(person = name) # 用原列名指定 # 或者用列位置指定 # rename(person = 1)
方法3:用匿名函数传递给set_names
set_names可以接受一个函数,用\(x)(R 4.1+语法)定义匿名函数来处理列名:
temp <- starwars[1:5,1:5] |> set_names(\(x) c("person", names(x)[-1]))
运行以上任意一种写法,都能得到你预期的结果:
temp #> # A tibble: 5 × 5 #> person height mass hair_color skin_color #> <chr> <int> <dbl> <chr> <chr> #> 1 Luke Skywalker 172 77 blond fair #> 2 C-3PO 167 75 <NA> gold #> 3 R2-D2 96 32 <NA> white, blue #> 4 Darth Vader 202 136 none white #> 5 Leia Organa 150 49 brown light
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

