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]])])
}
我有一个数据框,比如 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]])])
}