ChatGPT解决这个技术问题 Extra ChatGPT

更改数据框的列名

我有一个名为“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() 函数,但无济于事。

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

如果 Dirk 的回答有效,那么问题在于您使用的是矩阵而不是数据框。您可以使用 is.matrixstr 进行检查。
在 dplyr::rename stackoverflow.com/a/26146202/1831980 上查看此答案
colnames(newprice)<- c("premium","change","newprice")
您的错误与代码的质量无关。您只是使用了错误的符号。 R 无法识别这个“,请改用”。我知道它们可能看起来一样。仔细看:“”。而已。
以下几个答案使用硬编码位置,例如 colnames(X)[2] 中的 2。这通常不是一个好的做法,因为它对数据更改很敏感。如果您在此特定列之前向您的数据添加另一列怎么办?相反,请尝试 Hagos 提供的答案。

D
Dirk Eddelbuettel

使用 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"

@Dirk 为什么不使用 names() 而不是 colnames()?
伟大的!您还可以一次对多个列进行子集化(对大数据框很有用)。 colnames(X)[c(1,2)] <- c("good", "better")
试试 data.table 包中的 setnames()。使用类似 setnames(DT,"b","B")setnames(DT,c("a","E"),c("A","F"))
奇怪的是,在设置数据框 q1 的列名后,尝试使用 q1 <- q1 %>% mutate(rel_count = count / 482462) 中的 dplyr 改变数据框会导致错误 Error in mutate_impl(.data, dots) : unknown column 'days'(其中 days 是赋予列的新名称)。这真是令人沮丧。
R
Rorschach

我用这个:

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

谢谢你。我认为这对 R 来说有点烦人:如果您不想使用索引号而是使用旧名称,为什么更改列名如此困难:(
这种方法的好处是不必担心列的位置,只要知道它的原始名称即可。我认为这是首选方法,因为您稍后可能会更改更改要重命名的列的位置的代码。
也可以使用 data.table::setnames(dataframe,'Old','New')
J
Joshua Ulrich

该错误是由“智能引号”(或其他名称)引起的。这里的教训是,“不要在将引号转换为智能引号的‘编辑器’中编写代码”。

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

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


z
zx8754

尝试:

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

M
MichaelChirico

新的推荐方法是使用 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")

D
Desta Haileselassie Hagos

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

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

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

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

[names(data) == oldVariableName] 提取您想要重命名的变量名 (oldVariableName),然后 <- "newVariableName" 分配新的变量名。


如果您有一个带有例如 3 个 oldVariableNames 的向量,这将如何工作?
正是我要找的东西-> 2 竖起大拇指!!
很好,不是索引硬编码。
J
John Saunders

与其他类似:

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

相当简单且易于修改。


S
Sophanna

使用它通过 colname 函数更改列名。

colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"

d
discipulus

如果您只知道旧列名称时需要一次重命名而不是全部列,则可以使用 colnames 函数和 %in% 运算符。例子:

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

该代码假定您的列名的顺序等于插入的顺序
s
sbha

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

请参阅 dplyr::rename_with() 以了解更新的 tidyverse 方法。
M
Mehul Katara

我的列名如下

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

我想更改 Class 和 Sex 的列名

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

S
Smern

尝试:

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

j
jangorecki

只是为了更正和稍微扩展 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)

因此,如果您达到了内存限制,您可以考虑改用这个。


B
Baykal

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

newprice <- edit(newprice)

并手动更改列名。


这不是仅适用于向量和因子元素吗? > locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
它至少适用于数据帧。这就是我所知道的。
D
Dave Gruenewald

这可能会有所帮助:

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
}

# Specify new dataframe
df=rename.columns(df,list(old.column='new.column.name'))

R
Raghavan vmvs

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

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

我们将 DF1 的名称更改如下

 colnames(DF1)<- colnames(DF2)

k
kakarot

使用 data.table 的一个选项:

library(data.table)

setDT(dataframe)

setnames(dataframe,'Old1','New1')
setnames(dataframe,'Old2','New2')

H
Henry Ecker

更改数据框列名

colnames(dataset)[colnames(dataset) == 'name'] <- 'newcolumnname'