通过更改值来更改数据框的列名 - R

6

假设我有以下数据框。

df.open<-c(1,4,5)
df.close<-c(2,8,3)

df<-data.frame(df.open, df.close)



> df
  df.open df.close
1       1        2
2       4        8
3       5        3

我想更改包含“open”的列名为“a”,包含“close”的列名为“b”:
换句话说,我想要获得以下数据框:
  a b
1 1 2
2 4 8
3 5 3

我有许多这样的数据框。前置值(这里是“df.”)正在更改,但“open”和“close”是固定的。

非常感谢。

3个回答

4
我们可以创建一个可重用的函数。
f1 <- function(dat) {
     names(dat)[grep('open$', names(dat))] <- 'a'
      names(dat)[grep('close$', names(dat))] <- 'b'
     dat
}

并应用于数据

df <- f1(df)

-输出

df
  a b
1 1 2
2 4 8
3 5 3

如果这些数据集是在一个列表
lst1 <- list(df, df)
lst1 <- lapply(lst1, f1)

3
感谢亲爱的@akrun一如既往地提出了有见地的建议,我们可以通过一次操作来完成此任务。因此,我们在str_replacepatternreplacement参数中创建字符向量,以便同时执行两个操作。我们可以为每个参数分配一个长度为1或更多的字符向量。如果是后者,则这两个向量的长度应相应。更确切地说,正如文档所述:

引用形式为\1、\2等将被替换为相应匹配组(由()创建)的内容。

library(dplyr)
library(stringr)

df %>%
  rename_with(~ str_replace(., c(".*\\.open", ".*\\.close"), c("a", "b"))) 

  a b
1 1 2
2 4 8
3 5 3

2

使用 gsub + match + setNames 的另一个基础 R 选项

setNames(
  df,
  c("a", "b")[match(
    gsub("[^open|close]", "", names(df)),
    c("open", "close")
  )]
)

提供

  a b
1 1 2
2 4 8
3 5 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接