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]
#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_with
(contains
)的示例: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
评论
@aix的解决方案适用于1列的data.frame。您可能对drop = TRUE的默认参数[感到困惑,这会导致将“ 1列”对象转换为向量...而向量没有同名。您尝试过的例子将非常有帮助。如果您使用“ colnames(x)[1] <-'newname2'”
,它将起作用