如何在R函数中修改指定列的列名?
问题描述
我有一个read_prem_league函数,调用read_prem_league(2015)会返回一个包含Team列的tibble。我想把该列(或者其他函数返回数据框的第2列)统一重命名为Club,需要类似names(dat)[2] <- "year"的通用实现代码。
原函数代码:
read_prem_league <- function(year) { "https://en.wikipedia.org/wiki/" %>% paste0(year - 1, "-", substr(as.character(year), 3, 4), "_Premier_League") %>% read_html() %>% html_table() %>% getElement(5) }
调用示例:
read_prem_league(2015)
返回的tibble示例(部分):
#> # A tibble: 20 x 11 #> Pos Team Pld W D L GF GA GD Pts #> <int> <chr> <int> <int> <int> <int> <int> <int> <chr> <int> #> 1 1 Manchester City (C) 38 27 5 6 83 32 +51 86 #> ... #> # ... with 1 more variable: `Qualification or relegation` <chr>
参考示例代码:
dat <- read.csv(url) names(dat)[2] <- "year" dat
解决方案
方法1:基础R语法(匹配参考示例逻辑)
直接用names()或colnames()按列位置修改,和参考代码逻辑完全一致:
# 获取数据 dat <- read_prem_league(2015) # 修改第2列列名 names(dat)[2] <- "Club" # 用colnames也能达到同样效果 colnames(dat)[2] <- "Club"
如果想按列名(Team)修改(更稳妥,避免列位置变动导致错误):
names(dat)[names(dat) == "Team"] <- "Club"
方法2:tidyverse风格(dplyr语法)
如果习惯使用tidyverse工具链,用rename()函数更直观,支持按列名或位置修改:
library(dplyr) # 按列名修改 dat <- read_prem_league(2015) %>% rename(Club = Team) # 按列位置修改(第2列) dat <- read_prem_league(2015) %>% rename(Club = 2)
方法3:整合到原函数中
如果希望每次调用函数直接返回重命名后的结果,可以把重命名逻辑嵌入原函数:
read_prem_league <- function(year) { "https://en.wikipedia.org/wiki/" %>% paste0(year - 1, "-", substr(as.character(year), 3, 4), "_Premier_League") %>% read_html() %>% html_table() %>% getElement(5) %>% # 二选一:按列名或位置重命名 rename(Club = Team) # rename(Club = 2) }
这样调用read_prem_league(2015)时,返回的tibble会直接包含Club列,无需额外处理。
内容的提问来源于stack exchange,提问作者Sara Dwindler
相关产品推荐
相关产品推荐

