我正在尝试一次更改数据框的三个列名称。
当我使用一个列名更改时,我的代码运行良好:
names(df)[names(df)== "name1")] <- "name12"
但是当我尝试在一个命令中更改三个列名时,发生了错误:
names(df)[names(df)= c("name1, "name2", "name3")] <- c("name12", "name22", "name32")
如果有人能提供帮助,我将不胜感激。
答案 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}}