我知道如果我的数据框的列数超过1,则可以使用

colnames(x) <- c("col1","col2")


重命名列。如果只有一列怎么办?
表示仅包含一列的向量或数据框。

示例:

trSamp <- data.frame(sample(trainer$index, 10000))
head(trSamp )
#   sample.trainer.index..10000.
# 1                      5907862
# 2                      2181266
# 3                      7368504
# 4                      1949790
# 5                      3475174
# 6                      6062879

ncol(trSamp)
# [1] 1
class(trSamp)
# [1] "data.frame"
class(trSamp[1])
# [1] "data.frame"
class(trSamp[,1])
# [1] "numeric"
colnames(trSamp)[2] <- "newname2"
# Error in names(x) <- value : 
#   'names' attribute [2] must be the same length as the vector [1]


评论

@aix的解决方案适用于1列的data.frame。您可能对drop = TRUE的默认参数[感到困惑,这会导致将“ 1列”对象转换为向量...而向量没有同名。您尝试过的例子将非常有帮助。

如果您使用“ colnames(x)[1] <-'newname2'”
,它将起作用

#1 楼

colnames(trSamp)[2] <- "newname2"


尝试设置第二列的名称。您的对象只有一列,因此该命令将引发错误。这应该足够:

colnames(trSamp) <- "newname2"


评论


。@ JoshuaUlrich-如果列名类似于“ A,B,C,X,Y,Z”,而我想使用testData [379] <-“ Y”将其重命名为Y,这似乎不起作用。

–车丹·阿文·帕蒂尔(Chetan Arvind Patil)
19年1月17日在16:10



#2 楼

这是一种通用的方式,您无需记住变量的确切位置:

# df = dataframe
# old.var.name = The name you don't like anymore
# new.var.name = The name you want to get

names(df)[names(df) == 'old.var.name'] <- 'new.var.name'


这段代码几乎可以完成以下操作:



names(df)查找df中的所有名称


[names(df) == old.var.name]提取要检查的变量名称

<- 'new.var.name'分配新的变量名称。


评论


我对R也很陌生,喜欢这个解决方案!我实际上已经检查了它的功能,并且我认为值得指出的是[names(df)== old.var.name]实际上返回一个带有true / false值的向量。因此,如果使用正则表达式,则有可能更改多个列名。

– mikyatope
2013年12月11日下午16:21

对于正则表达式结果,请使用names(df)= sub('pattern','replacement',names(df))之类的东西。否则,您将尝试将多个列设置为相同的名称。

–我们都是莫妮卡
2014年9月27日在20:09

百感交集……在一个完美的世界中,到处都是完美的编程语言,难道真的需要这么多次击键才能更改单个列的名称吗?我喜欢R,但有时出于某些原因我想勒死它。

–tumultous_rooster
15年8月15日在1:19

base中怎么没有包装函数呢?

–ifly6
18-09-6在17:03

我们都多么希望!我现在不知道,但是那时基础上没有任何包装

–Side_0o_Effect
18-09-20在11:07



#3 楼

colnames(df)[colnames(df) == 'oldName'] <- 'newName'


评论


我喜欢这种解决方案,因为您可以按名称引用列名,而不是要求知道它是哪个数字列。更适合较大数量的功能。

–网络控制
2014年8月22日在17:18

我对这个问题和这个答案做了一个小扩展。我有一个带有一栏的数据框,其中包含字母“ snp”。我想将其重命名为“标记”。但我想使用正则表达式来执行此操作。显然我的代码存在缺陷:colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)==“ ^ snp $”] <-“ Marker”,因为该列未重命名。如果我执行名称(GWASDATA_RAWSELECTION)[名称(GWASDATA_RAWSELECTION)==“ snp”] <-“标记”,则将其重命名。我想念什么?

– Sander W. van der Laan
16-11-29在22:13



#4 楼

这是一个老问题,但值得注意的是,您现在可以使用setnames软件包中的data.table

library(data.table)

setnames(DF, "oldName", "newName")

# or since the data.frame in question is just one column: 
setnames(DF, "newName")

# And for reference's sake, in general (more than once column)
nms <- c("col1.name", "col2.name", etc...)
setnames(DF, nms)


评论


或基数R中的setNames。

–PatrickT
19年3月4日在11:08

#5 楼

您也可以使用Hadley的plyr软件包和rename函数来完成此操作。 。例如,进行合并后,您可能会遇到以下问题:

评论


重命名现在也是dplyr软件包中的函数。

–山姆·菲克(Sam Firke)
2015年4月29日在17:42



#6 楼

我认为重命名列的最佳方法是使用dplyr包,如下所示: />

#7 楼

我喜欢采用一种样式来逐个重命名数据框列名称。

按特定列的索引。

评论


+1使用户有机会使用实际的旧名称:)

–user1685185
2014年1月27日15:13

与@zongshiwujie的解决方案相比有什么区别?

– Buhtz
16年8月24日在6:48

which()是不必要的。

–sindri_baldur
18年8月10日在11:16

#8 楼

我发现重命名单列的最便捷方法是使用dplyr::rename_at:存储在变量中的变量
可以使用名称或列索引进行操作
简洁明了


#9 楼

您可以在rename.vars软件包中使用gdata。在变量名中添加一些文本,然后可以执行以下操作:

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")


有关将文本附加到变量名子集的示例,请参见: ://stackoverflow.com/a/28870000/180892

评论


这是最简单的,谢谢。 dplyr软件包有问题。

– DannyB
17-10-2在20:18

#10 楼

这可能已经存在,但是我在寻找解决方案并一时兴起尝试时重命名字段。为我的目的而工作。

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL


编辑从这里开始...。

这也可以。

df <- rename(df, c("oldColName" = "newColName"))


评论


对于任何拒绝我的人来说,这都很好,但是由于我显然不是这样做的新手,所以也许您可以从答案中找到启发。

–斯科蒂
17年2月2日,下午2:56

您的答案没有什么错,除了它不是一个单行代码。这只是一个敌对的SO用户,没有勇气证明自己发脾气。

–count0
17 Mar 10 '17在19:12



谢谢@ count0。拥有一些法力值或对问题进行评论实际上是有意义的,这是我尚未能够做到的。在某些情况下,跟进我学习新技能的问题会很好。再次。 TY。

–斯科蒂
17年3月11日在21:12

我们需要给所有列命名以使用它。

–Arpit Sisodia
17年4月2日在8:47

重命名功能来自哪个包?

–迭戈
3月19日0:40

#11 楼

尝试:

colnames(x)[2] <- 'newname2'


评论


这就是引发OP请求的错误(在他的编辑中)。它不起作用,因为数据框只有一列。

–user399470
2011-09-23 22:05

。@ NPE-如果列名类似于“ A,B,C,X,Y,Z”,在此我想使用testData [379] <-“ Y”将其重命名为Y,这似乎不起作用。

–车丹·阿文·帕蒂尔(Chetan Arvind Patil)
19年1月17日在16:10



#12 楼

您还可以尝试从“ Hmisc”包中获取“ upData”。

library(Hmisc)

trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2'))

评论


非常好!也可以一次重命名更多列:trSamp = upData(trSamp,重命名= c(sample.trainer.index..10000。='newname2,AnotherColumnName ='RenameThisColumn'))

–FraNut
16年7月7日在13:11

#13 楼

如果您知道数据框只有一列,则可以使用:
names(trSamp) <- "newname2"

#14 楼

令df为具有数据集名称myDays和temp的数据帧。
如果要将“ myDays”重命名为“ Date”,
library(plyr)
rename(df,c("myDays" = "Date"))

或使用管道,则可以
dfNew      <- df %>% 
  plyr::rename(c("myDays" = "Date"))


#15 楼

OP的问题得到了很好的回答。但是,此方法在某些情况下可能有用:列名的部分匹配,而不考虑其在数据框中的位置:

部分匹配名称:

d <- data.frame(name1 = NA, Reported.Cases..WHO..2011. = NA, name3 = NA)
##   name1 Reported.Cases..WHO..2011. name3
## 1    NA                         NA    NA
names(d)[grepl("Reported", names(d))] <- "name2"
##   name1 name2 name3
## 1    NA    NA    NA


另一个示例:在出现“标点符号”的情况下进行部分匹配:
思想可能值得分享。

#16 楼

我只需将一个新列添加到具有所需名称的数据框中,然后从现有列中获取数据即可。像这样:

dataf$value=dataf$Article1Order


然后我删除旧列!像这样:

dataf$Article1Order<-NULL


这段代码似乎很愚蠢!但是效果很好...

#17 楼

我发现colnames()参数更容易
https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/row%2Bcolnames

从数据框中选择某些列

df <- data.frame(df[, c( "hhid","b1005", "b1012_imp", "b3004a")])


并按顺序重命名所选列,

colnames(df) <- c("hhid", "income", "cost", "credit")


检查名称和值以确保

names(df);head(df)


#18 楼

我们可以使用rename_with重命名具有函数的列(例如stringr函数)。请考虑以下数据df_1

df_1 <- data.frame(
  x = replicate(n = 3, expr = rnorm(n = 3, mean = 10, sd = 1)), 
  y = sample(x = 1:2, size = 10, replace = TRUE)
)

names(df_1)

#[1] "x.1" "x.2" "x.3" "y" 


重命名所有带有dplyr::everything()的变量: />带有dplyr的示例(starts_with变量):
ends_withcontains)的示例:

library(tidyverse)

df_1 %>% 
  rename_with(.data = ., .cols = everything(.), 
              .fn = str_replace, pattern = '.*', 
              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
  names()

#[1] "var_1" "var_2" "var_3" "var_4"


警告:


警告消息:
1:在stri_replace_first_regex(字符串,模式,fix_replacement(替换)中,:
较长的对象长度不是较短的对象长度的倍数
2:在名称[cols] <-.fn(名称[cols] ,...):
要替换的项目数不是替换长度的倍数


它无关紧要,因为这只是matches与replace函数的不一致。

#19 楼

我只需使用以下代码将列名更改为具有所需新名称的数据集:
names(dataset)[index_value] <-“ new_col_name”

#20 楼

library(dplyr)
rename(data, de=de.y)


评论


补充一点为什么这可以解决OP的问题?

– Guillaume Racicot
19年7月24日在13:30