首页 文章

更改数据框的列名称

提问于
浏览
309

我有一个名为“newprice”的数据框(见下文),我想在R中改变程序中的列名 .

> newprice
   Chang.  Chang.   Chang.
1     100       36      136
2     120      -33       87
3     150       14      164

事实上这正在做什么:

names(newprice)[1]<-paste("premium")
names(newprice)[2]<-paste("change")
names(newprice)[3]<-paste("newprice")

我没有将它放在循环中,因为我希望每个列名称与您看到的不同 .

当我将程序粘贴到R控制台时,这是它给我的输出:

> names(newprice)[1]<-paste(“premium”)
Error: unexpected input in "names(newprice)[1]<-paste(“"
> names(newprice)[2]<-paste(“change”)
Error: unexpected input in "names(newprice)[2]<-paste(“"
> names(newprice)[3]<-paste(“newpremium”)
Error: unexpected input in "names(newprice)[3]<-paste(“"

我同样尝试使用 c() 函数 - 例如 c("premium") ,而不是 paste() 函数,但无济于事 .

有人能帮我解决这个问题吗?

16 回答

  • 8

    如果我们有2个数据帧,则以下工作

    DF1<-data.frame('a', 'b')
     DF2<-data.frame('c','d')
    

    我们更改DF1的名称如下

    colnames(DF1)<- colnames(DF2)
    
  • 497

    如果只知道旧列名称时需要一次重命名除多列以外的所有列,则可以使用 colnames function和 %in% operator . 例:

    df = data.frame(bad=1:3, worse=rnorm(3), worst=LETTERS[1:3])
    
       bad      worse    worst
    1   1 -0.77915455       A
    2   2  0.06717385       B
    3   3 -0.02827242       C
    

    现在你想把“坏”和“最坏”改为“好”和“最好” . 您可以使用

    colnames(df)[which(colnames(df) %in% c("bad","worst") )] <- c("good","best")
    

    这导致了

    good      worse  best
    1    1 -0.6010363    A
    2    2  0.7336155    B
    3    3  0.9435469    C
    
  • 26

    我用这个:

    colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
    
  • 3

    该错误是由“智能引号”(或称为它们)引起的 . 这里的教训是,“不要在'编辑器'中编写代码,将引号转换为智能引号” .

    names(newprice)[1]<-paste(“premium”)  # error
    names(newprice)[1]<-paste("premium")  # works
    

    此外,您不需要 paste("premium") (对 paste 的调用是多余的)并且最好在 <- 周围放置空格以避免混淆(例如 x <- -10; if(x<-3) "hi" else "bye"; x ) .

  • 130

    dplyr::rename()dplyr::select() 有两个选项:

    library(dplyr)
    
    mtcars %>% 
      tibble::rownames_to_column('car_model') %>%                            # convert rowname to a column. tibble must be installed.
      select(car_model, est_mpg = mpg, horse_power = hp, everything()) %>%   # rename specific columns and reorder
      rename(weight = wt, cylinders = cyl) %>%                               # another option for renaming specific columns that keeps everything by default
      head(2)
          car_model est_mpg horse_power cylinders disp drat weight  qsec vs am gear carb
    1     Mazda RX4      21         110         6  160  3.9  2.620 16.46  0  1    4    4
    2 Mazda RX4 Wag      21         110         6  160  3.9  2.875 17.02  0  1    4    4
    

    对于所有列名称,还有三个范围的 dplyr::rename()dplyr::rename_all() 变体, dplyr::rename_if() 用于有条件地定位列名称, dplyr::rename_at() 用于选择命名列 . 以下示例使用下划线替换空格和句点,并将所有内容转换为小写:

    iris %>%  
      rename_all(~gsub("\\s+|\\.", "_", .)) %>% 
      rename_all(tolower) %>% 
      head(2)
      sepal_length sepal_width petal_length petal_width species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    

    dplyr::select_all() 也可以类似的方式使用:

    iris %>%  
      select_all(~gsub("\\s+|\\.", "_", .)) %>% 
      select_all(tolower) %>% 
      head(2)
      sepal_length sepal_width petal_length petal_width species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    
  • 5

    新建议的方法是使用 setNames 函数 . 见 ?setNames . 由于这会创建 data.frame 的新副本,请确保将结果分配给原始 data.frame ,如果这是您的意图 .

    data_frame <- setNames(data_frame, c("premium","change","newprice"))
    

    如果您使用早期答案建议的某些方式使用 colnames ,则较新版本的R会给您警告 .

    如果这是 data.table ,您可以使用 data.table 函数 setnames ,它可以通过引用修改特定列名或单个列名:

    setnames(data_table, "old-name", "new-name")
    
  • 68

    您可以通过以下方式进行编辑:

    newprice <- edit(newprice)
    

    并手动更改列名称 .

  • 1

    这可能会有所帮助:

    rename.columns=function(df,changelist){
      #renames columns of a dataframe
      for(i in 1:length(names(df))){
        if(length(changelist[[names(df)[i]]])>0){
          names(df)[i]= changelist[[names(df)[i]]]
        }
      }
      df
    }
    

    DF = rename.columns(DF,列表(old.column = 'new.column.name'))

  • 32

    你可以直接做完了

    names(newprice) <- c("premium","change","newprice")
    

    您正在使用的粘贴命令至少需要2个参数 . 它的工作方式类似于excel中的连接函数,这就是为什么它会给你一个错误 .

  • 2

    你有没有尝试过:

    names(newprice)[1]<-"premium"

  • 2

    尝试:

    names(newprice) <- c("premium", "change", "newprice")
    
  • 9

    我的专栏名称如下

    colnames(t)
    [1] "Class"    "Sex"      "Age"      "Survived" "Freq"
    

    我想更改Class和Sex的列名

    colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
    
  • 7

    我有同样的问题,这段代码为我解决了 .

    names(data)[names(data) == "oldVariableName"] <- "newVariableName"
    

    简而言之,此代码执行以下操作:

    names(data) 查看数据框中的所有名称( data

    [names(data) == oldVariableName] 提取要重命名的变量名称( oldVariableName ), <- "newVariableName" 分配新变量名称 .

  • 15

    只是为了纠正并略微扩展Scott Wilson的答案 .
    您也可以在data.frames上使用data.table的 setnames 函数 .

    不要指望操作加速,但是你可以期望 setnames 更有效地消耗内存,因为它通过引用更新列名 . 可以使用 address 功能跟踪此功能,如下所示 .

    library(data.table)
    set.seed(123)
    n = 1e8
    
    df = data.frame(bad=sample(1:3, n, TRUE), worse=rnorm(n))
    address(df)
    #[1] "0x208f9f00"
    colnames(df) <- c("good", "better")
    address(df)
    #[1] "0x208fa1d8"
    rm(df)
    
    dt = data.table(bad=sample(1:3, n, TRUE), worse=rnorm(n))
    address(dt)
    #[1] "0x535c830"
    setnames(dt, c("good", "better"))
    address(dt)
    #[1] "0x535c830"
    rm(dt)
    

    因此,如果你达到内存限制,你可以考虑使用这个 .

  • 39

    使用 colnames() 功能:

    R> X <- data.frame(bad=1:3, worse=rnorm(3))
    R> X
      bad     worse
    1   1 -2.440467
    2   2  1.320113
    3   3 -0.306639
    R> colnames(X) <- c("good", "better")
    R> X
      good    better
    1    1 -2.440467
    2    2  1.320113
    3    3 -0.306639
    

    你也可以分组:

    R> colnames(X)[2] <- "superduper"
    
  • 1

    与其他人类似:

    cols <- c("premium","change","newprice")
    colnames(dataframe) <- cols
    

    非常简单易于修改 .

相关问题