如何重命名data.frame中的单个列?

scr*_*Owl 307 r

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

colnames(x) <- c("col1","col2")
Run Code Online (Sandbox Code Playgroud)

重命名列.如果它只是一列,我该怎么做?意味着矢量或数据框中只有一列.

例:

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]
Run Code Online (Sandbox Code Playgroud)

小智 523

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

# 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'
Run Code Online (Sandbox Code Playgroud)

这段代码几乎可以做到以下几点:

  1. names(df) 查看中的所有名称 df
  2. [names(df) == old.var.name] 提取要检查的变量名称
  3. <- 'new.var.name' 分配新变量名称.

  • 复杂的感觉......在一个完美的世界中,完美的编程语言比比皆是,它真的需要这么多的击键才能改变单个列的名称吗?我喜欢R但有时我想因为这些原因而扼杀它. (37认同)
  • 我对R也很新,喜欢这个解决方案!我实际上检查了它的作用,我认为值得指出`[names(df)== old.var.name]`实际上返回一个带有true/false值的向量.因此,如果使用正则表达式,它有可能更改多个列名. (5认同)
  • 对于正则表达式结果,使用类似`names(df)= sub('pattern','replacement',names(df))`的东西.否则,您将尝试将多个列设置为相同的名称. (3认同)
  • base中怎么没有包装函数呢? (3认同)
  • 它疯狂如何我继续尝试``names(df [names(df)=="mpg"])``并继续回答这个答案以获得正确的语法**``names(df)[names(df)= ="mpg"]``** (2认同)
  • 这应该是公认的答案,因为它更通用 (2认同)

Jos*_*ich 301

colnames(trSamp)[2] <- "newname2"
Run Code Online (Sandbox Code Playgroud)

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

colnames(trSamp) <- "newname2"
Run Code Online (Sandbox Code Playgroud)


zon*_*jie 78

colnames(df)[colnames(df) == 'oldName'] <- 'newName'
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,因为您可以按名称引用列名,而不是要求知道它是哪个数字列。更适合数量较多的特征。 (3认同)

Ric*_*rta 71

这是一个老问题,但值得注意的是,您现在可以setnamesdata.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)
Run Code Online (Sandbox Code Playgroud)

  • 或基数R中的``setNames''。 (5认同)

ale*_*ion 50

这也可以使用Hadley的plyr软件包和rename功能来完成.

library(plyr) 
df <- data.frame(foo=rnorm(1000)) 
df <- rename(df,c('foo'='samples'))
Run Code Online (Sandbox Code Playgroud)

您可以通过名称重命名(不知道位置)并一次执行多次重命名.例如,在完成合并之后,您最终可能会:

  letterid id.x id.y
1       70    2    1
2      116    6    5
3      116    6    4
4      116    6    3
5      766   14    9
6      766   14   13
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下步骤重命名:

letters <- rename(letters,c("id.x" = "source", "id.y" = "target"))

  letterid source target
1       70      2      1
2      116      6      5
3      116      6      4
4      116      6      3
5      766     14      9
6      766     14     13
Run Code Online (Sandbox Code Playgroud)

  • `rename`现在也是`dplyr`包中的一个函数. (6认同)
  • dplyr(v0.4.3)格式重命名不同.... df < - rename(df,samples = foo) (2认同)

Lui*_*uez 33

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

require(dplyr)
df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)
Run Code Online (Sandbox Code Playgroud)

它在重命名任何数据集中的一列或多列时的工作方式相同.


jsh*_*erd 11

我喜欢下一个逐个重命名数据框列名的样式.

colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'
Run Code Online (Sandbox Code Playgroud)

哪里

which(colnames(df) == 'old_colname')
Run Code Online (Sandbox Code Playgroud)

返回特定列的索引.

  • 与@zongshiwujie 的解决方案相比,这里有什么区别? (2认同)

Moo*_*per 11

我发现重命名单个列的最方便的方法是使用dplyr::rename_at:

library(dplyr)
cars %>% rename_at("speed",~"new") %>% head     
cars %>% rename_at(vars(speed),~"new") %>% head
cars %>% rename_at(1,~"new") %>% head

#   new dist
# 1   4    2
# 2   4   10
# 3   7    4
# 4   7   22
# 5   8   16
# 6   9   10
Run Code Online (Sandbox Code Playgroud)
  • 适用于管道链条
  • 名称存储在变量中时很方便
  • 使用名称或列索引
  • 清晰紧凑


NPE*_*NPE 7

尝试:

colnames(x)[2] <- 'newname2'
Run Code Online (Sandbox Code Playgroud)

  • 这就是OP询问的错误(在他的编辑中)的原因。它不起作用,因为数据框只有一列。 (8认同)

小智 6

让 df 成为您拥有的数据框,col 名称为 myDays 和 temp。如果要将“myDays”重命名为“Date”,

library(plyr)
rename(df,c("myDays" = "Date"))
Run Code Online (Sandbox Code Playgroud)

或者用管道,你可以

dfNew      <- df %>% 
  plyr::rename(c("myDays" = "Date"))
Run Code Online (Sandbox Code Playgroud)


Sco*_*eie 5

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

Table1$FieldNewName <- Table1$FieldOldName
Table1$FieldOldName <- NULL
Run Code Online (Sandbox Code Playgroud)

编辑从这里开始......

这也有效。

df <- rename(df, c("oldColName" = "newColName"))
Run Code Online (Sandbox Code Playgroud)


Jer*_*lim 5

您可以rename.varsgdata包中使用.

library(gdata)
df <- rename.vars(df, from = "oldname", to = "newname")
Run Code Online (Sandbox Code Playgroud)

如果您要更改多个变量名称,或者想要将某些文本追加或预先添加到变量名称,则此功能特别有用,那么您可以执行以下操作:

df <- rename.vars(df, from = c("old1", "old2", "old3", 
         to = c("new1", "new2", "new3"))
Run Code Online (Sandbox Code Playgroud)

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