关于r:如何重命名data.frame中的单个列?


How to rename a single column in a data.frame?

我知道如果我有一个多于一列的数据框,我可以使用

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

重命名列。 如果只有一栏,该怎么办?
表示其中仅包含一列的向量或数据帧。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
2
3
4
5
# 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'分配新的变量名称。

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

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

    1
    colnames(trSamp) <-"newname2"


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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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)


    这也可以使用Hadley的plyr包和rename函数来完成。

    1
    2
    3
    library(plyr)
    df <- data.frame(foo=rnorm(1000))
    df <- rename(df,c('foo'='samples'))

    您可以按名称重命名(不知道位置),并一次执行多个重命名。例如,进行合并后,您可能会得到以下结果:

    1
    2
    3
    4
    5
    6
    7
      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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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


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

    1
    2
    require(dplyr)
    df = rename(df, new_col01 = old_col01, new_col02 = old_col02, ...)

    重命名任何数据集中的一列或多列的工作原理相同。


    我喜欢一种用于逐一重命名数据框列名称的样式。

    1
    colnames(df)[which(colnames(df) == 'old_colname')] <- 'new_colname'

    哪里

    1
    which(colnames(df) == 'old_colname')

    通过特定列的索引返回。


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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
    • 在管道链中效果很好
    • 名称存储在变量中时很方便
    • 使用名称或列索引
    • 清晰紧凑

    您可以在gdata包中使用rename.vars

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

    如果您要更改多个变量名,或者想要在变量名后添加或添加一些文本,则可以执行以下操作:

    1
    2
    df <- rename.vars(df, from = c("old1","old2","old3",
             to = c("new1","new2","new3"))

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


    尝试:

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


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

    1
    2
    Table1$FieldNewName <- Table1$FieldOldName
    Table1$FieldOldName <- NULL

    编辑从这里开始。

    这也可以。

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


    您也可以尝试从" Hmisc"包中获取" upData"。

    library(Hmisc)

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


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


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


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

    1
    dataf$value=dataf$Article1Order

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

    1
    dataf$Article1Order<-NULL

    这段代码看起来很愚蠢!但是效果很好...


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

    名称部分匹配:

    1
    2
    3
    4
    5
    6
    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

    另一个示例:在存在"标点符号"的情况下进行部分匹配:

    1
    2
    3
    4
    5
    6
    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("[[:punct:]]", names(d))] <-"name2"
    ##   name1 name2 name3
    ## 1    NA    NA    NA

    这些是我今天必须处理的示例,我认为可能值得分享。


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