R函数用于重命名数据框的列

R function used to rename columns of a data frames

我有一个数据框,比如 acs10。我需要重新标记列。为此,我创建了另一个名为 labelName 的数据框,其中包含两列:第一列包含旧列名称,第二列包含我要使用的名称,例如下面的 table:

column_1 column_2
oldLabel1 newLabel1
oldLabel2 newLabel2

然后,我写了一个for循环来改变列名:

for (i in seq_len(nrow(labelName))){
  names(acs10)[names(acs10) == labelName[i,1]] <- labelName[i,2]}

,它有效。

但是,当我试图将 for 循环放入一个函数中时,因为我也需要为其他数据框重命名列名,所以该函数失败了。我写的函数如下所示:

renameDF <- function(dataF,varName){
  for (i in seq_len(nrow(varName))){
    names(dataF)[names(dataF) == varName[i,1]] <- varName[i,2]
    print(varName[i,1])
    print(varName[i,2])
    print(names(dataF))
  }
   
}

renameDF(acs10, labelName)

其中 dataF 是我需要更改其名称的数据框,而 varName 是另一个数据框,其中旧变量名和新变量名配对。我使用 print(names(dataF)) 进行调试,打印输出表明该函数有效。但是,调用该函数实际上并没有更改列名。我怀疑它与范围有关,但我想知道如何使其工作。

在您的函数中,您需要 return 更改后的数据框。

renameDF <- function(dataF,varName){
  for (i in seq_len(nrow(varName))){
    names(dataF)[names(dataF) == varName[i,1]] <- varName[i,2]
  }
  return(dataF)
}

您还可以通过使用 match 来简化此操作并避免 for 循环:

renameDF <- function(dataF,varName){
 names(dataF) <- varName[[2]][match(names(dataF), varName[[1]])]
 return(dataF)
}

这应该在一行中完成所有事情。

colnames(acs10)[colnames(acs10) %in% labelName$column_1] <- labelName$column_2[match(colnames(acs10)[colnames(acs10) %in% labelName$column_1], labelName$column_1)]

如果列名不在数据字典中,这将起作用,但它有点复杂:

library(tibble)

df <- tribble(~column_1,~column_2,
"oldLabel1",    "newLabel1",
"oldLabel2",    "newLabel2")

d <- tibble(oldLabel1 = NA, oldLabel2 = NA, oldLabel3 = NA)

fun <- function(dat, dict) {
  names(dat) <- sapply(names(dat), function(x) ifelse(x %in% dict$column_1, dict[dict$column_1 == x,]$column_2, x))
  dat
}

fun(d, df)

您可以创建一个仅包含一行代码的函数。

renameDF <- function(df, varName){
  
  
  setNames(df,varName[[2]][pmatch(names(df),varName[[1]])])
  
  
}