【问题标题】:How to rename a single column in a data.frame?如何重命名 data.frame 中的单个列?
【发布时间】:2019-06-30 07:43:43
【问题描述】:

我知道如果我有一个超过 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。您尝试的示例将非常有帮助。
  • 如果你使用 "colnames(x)[1]

标签: r


【解决方案1】:

试试:

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

【讨论】:

  • 这就是 OP 询问的错误(在他的编辑中)。它不起作用,因为数据框只有一列。
  • .@NPE - 如果列名类似于"A,B,C,X,Y,Z" 我想使用testData[379] &lt;- "Y" 将其重命名为Y,这似乎不起作用。
【解决方案2】:
colnames(trSamp)[2] <- "newname2"

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

colnames(trSamp) <- "newname2"

【讨论】:

  • .@JoshuaUlrich - 如果列名类似于"A,B,C,X,Y,Z" 我想使用testData[379] &lt;- "Y" 将其重命名为Y,这似乎不起作用。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您也可以尝试“Hmisc”包中的“upData”。

    library(Hmisc)

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

    【讨论】:

    • 非常好!也可以一次重命名更多列:trSamp = upData(trSamp, rename=c(sample.trainer.index..10000. = 'newname2, AnotherColumnName = 'RenameThisColumn'))
    【解决方案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'
    

    这段代码几乎做了以下事情:

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

    【讨论】:

    • 我对 R 也很陌生,喜欢这个解决方案!我实际上检查了它的作用,我认为值得指定 [names(df) == old.var.name] 实际上返回一个具有真/假值的向量。因此,例如,如果使用正则表达式,它就有可能更改多个列名。
    • 对于正则表达式结果,使用类似names(df) = sub('pattern', 'replacement', names(df))的东西。否则,您将尝试将多个列设置为相同的名称。
    • 百感交集...在一个完美的世界里,完美的编程语言比比皆是,真的需要这么多次击键来更改单个列的名称吗?我喜欢 R,但有时出于这些原因我想扼杀它。
    • base 中怎么没有这个封装函数?
    • 这应该是公认的答案,因为它更通用
    【解决方案6】:

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

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

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

      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
    

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

    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
    

    【讨论】:

    • rename 现在也是 dplyr 包中的一个函数。
    【解决方案7】:

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

    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)
    

    【讨论】:

    • setNames 来自基础 R。
    【解决方案8】:

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

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

    在哪里

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

    按特定列的索引返回。

    【讨论】:

    • +1 让用户有机会使用实际的旧名称 :)
    • 与@zongshiwujie 的解决方案相比,这里有什么不同?
    • which() 不是必需的。
    【解决方案9】:
    colnames(df)[colnames(df) == 'oldName'] <- 'newName'
    

    【讨论】:

    • 我喜欢这个解决方案,因为您可以按名称引用列名,而不是要求知道它是哪个数字列。更适合大量特征。
    • 我对这个问题和这个答案有一个小的扩展。我有一个数据框,其中有一列包含字母 'snp' 。我想把它重命名为'Marker'。但我想使用 正则表达式 来做到这一点。显然我的代码有缺陷:colnames(GWASDATA_RAWSELECTION)[colnames(GWASDATA_RAWSELECTION)=="^snp$"] &lt;- "Marker",因为该列没有重命名。如果我这样做 names(GWASDATA_RAWSELECTION)[names(GWASDATA_RAWSELECTION)=="snp"] &lt;- "Marker"重命名。我错过了什么?
    【解决方案10】:

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

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

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

    这也有效。

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

    【讨论】:

    • 无论是谁给我打分,这很好,但由于我显然是这样做的新手,也许你可以启发答案的问题。
    • 你的回答没有任何问题,除了它不是一个单行者。那只是一个敌对的 SO 用户没有勇气为他的发脾气辩护。
    • 谢谢@count0。对一个问题有一些法力点或任何东西来评论实际上是有意义的,这是我尚未能够做到的。当我学习新技能时,在某些情况下跟进问题会很好。再次。泰。
    • 我们需要给所有列的名称来使用它。
    • rename函数来自哪个包?
    【解决方案11】:

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

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

    如果您有多个变量名要更改,或者您想在变量名中附加或预先附加一些文本,这特别有用,那么您可以执行以下操作:

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

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

    【讨论】:

    • 这是最简单的,谢谢。 dplyr 包有问题。
    【解决方案12】:

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

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

    重命名任何数据集中的一列或多列都一样。

    【讨论】:

      【解决方案13】:

      我发现重命名单个列最方便的方法是使用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
      
      • 在管道链中运行良好
      • 方便将名称存储在变量中
      • 使用名称或列索引
      • 清晰紧凑

      【讨论】:

        【解决方案14】:

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

        dataf$value=dataf$Article1Order
        

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

        dataf$Article1Order<-NULL
        

        这段代码可能看起来很傻!但是效果很好……

        【讨论】:

          【解决方案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
          

          另一个例子:存在“标点符号”的部分匹配:

          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
          

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

          【讨论】:

            【解决方案16】:

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

            【讨论】:

              【解决方案17】:
              library(dplyr)
              rename(data, de=de.y)
              

              【讨论】:

              • 想补充一下为什么这有助于解决 OP 的问题?
              【解决方案18】:

              我发现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)
              

              【讨论】:

                【解决方案19】:

                我们可以使用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()重命名所有变量

                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"
                

                通过名称粒子重命名,并带有一些dplyr 动词(starts_withends_withcontainsmatches,...)。

                . 示例(x 变量):

                df_1 %>% 
                  rename_with(.data = ., .cols = contains('.'), 
                              .fn = str_replace, pattern = '.*', 
                              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
                  names()
                
                #[1] "var_1" "var_2" "var_3" "y"
                

                通过class重命名,具有类测试的许多功能,如is.integeris.numericis.factor...

                is.integer (y) 为例:

                df_1 %>% 
                  rename_with(.data = ., .cols = is.integer, 
                              .fn = str_replace, pattern = '.*', 
                              replacement = str_c('var', seq_along(.), sep = '_')) %>% 
                  names()
                
                #[1] "x.1"   "x.2"   "x.3"   "var_1"
                

                警告:

                警告信息: 1:在 stri_replace_first_regex(string, pattern, fix_replacement(replacement), : 较长的对象长度不是较短对象长度的倍数 2:在名称[cols]

                不相关,只是seq_along(.)与替换功能不一致。

                【讨论】:

                  【解决方案20】:

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

                  library(plyr)
                  rename(df,c("myDays" = "Date"))
                  

                  或者用管道,你可以

                  dfNew      <- df %>% 
                    plyr::rename(c("myDays" = "Date"))
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-12-09
                    • 2020-05-22
                    • 2020-02-06
                    • 2020-05-31
                    • 2015-11-10
                    • 1970-01-01
                    • 2016-05-27
                    相关资源
                    最近更新 更多