如何一次更改多个列名?

时间:2018-03-13 08:54:12

标签: r dataframe

我正在尝试一次更改数据框的三个列名称。

当我使用一个列名更改时,我的代码运行良好:

    names(df)[names(df)== "name1")] <- "name12"  

但是当我尝试在一个命令中更改三个列名时,发生了错误:

    names(df)[names(df)= c("name1, "name2", "name3")] <- c("name12", "name22", "name32")  

如果有人能提供帮助,我将不胜感激。

4 个答案:

答案 0 :(得分:1)

简单==检查,检查eqaulity。所以1 == 1是真的。但是,如果你想检查多个值,你必须使用一个不同的运算符(我知道,很奇怪吧?!)基本上在行中 names(dmodel112)= c("name1, "name2", "name3")您尝试将整个向量(数据框的名称)与向量进行比较。

Beter是names(dmodel112) %in% c("name1, "name2", "name3")

这样你就可以检查向量c中的每个选项(“name1”,“name2”等)

答案 1 :(得分:1)

&#34; data.table&#34; package有一个函数setnames,可以通过引用设置名称,并且只允许替换&#34; old中的特定名称 - &gt;新&#34;语法类型。

df <- data.frame(name1 = 1:2, name2 = 3:4, name3 = 5:6, V1 = 7:8)
df
#   name1 name2 name3 V1
# 1     1     3     5  7
# 2     2     4     6  8

library(data.table)
setnames(df, c("name1", "name2", "name3"), c("name12", "name22", "name32"))
df
#   name12 name22 name32 V1
# 1      1      3      5  7
# 2      2      4      6  8

了解&#34;通过引用设置名称&#34;另外,与使用tracemem()相比,您可以使用setnames()查看直接分配所发生的情况:

tracemem(df)
# [1] "<000000001A58CDB8>"
names(df) <- letters[1:4]
# tracemem[0x000000001a58cdb8 -> 0x000000001c571670]: 
# tracemem[0x000000001c571670 -> 0x000000001c571478]: 
df
#   a b c d
# 1 1 3 5 7
# 2 2 4 6 8

setnames(df, LETTERS[1:4])
df
#   A B C D
# 1 1 3 5 7
# 2 2 4 6 8
tracemem(df)
# [1] "<000000001C571478>"

请注意,您可以通过两种方式使用setnames

## Replace specific names by specific values
setnames(your_data_frame, names_to_replace, replacement_values)

## Replace all names
setnames(your_data_frame, new_names)

答案 2 :(得分:0)

只需使用which获取列索引,如下所示:

colnames(df)[which(colnames(df) %in% c("name1, "name2", "name3")] <- c("name12", "name22", "name32")

答案 3 :(得分:0)

当你知道列号时,你可以做到

{{1}}