正在修改数据帧的列名

我有一个名为“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()函数,但没有用。

有人能帮我弄清楚吗?

1802216 次浏览

试一试:

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

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

这个错误是由“smart-quotes”(或者不管它们叫什么)引起的。这里的教训是,“不要在将引号转换为智能引号的‘编辑器’中编写代码”。

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

此外,你不需要paste("premium")(对paste的调用是多余的),并且在<-周围加上空格以避免混淆是一个好主意(例如x <- -10; if(x<-3) "hi" else "bye"; x)。

你可以通过以下方法进行编辑:

newprice <- edit(newprice)

并手动更改列名。

试一试:

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

我用这个:

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

与其他相似:

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

相当简单,易于修改。

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

只是纠正和稍微扩展斯科特·威尔逊的回答 你可以使用数据。表的setnames函数也用于data.frames。< / p >

不要期望操作速度加快,但你可以期望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)

所以,如果你的记忆力快到极限了,你可以考虑用这个来代替。

我有同样的问题,这段代码为我工作。

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

简而言之,这段代码做了以下工作:

names(data)查找数据帧中的所有名称(data)

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

如果你需要一次重命名多个列,而你只知道旧的列名,你可以使用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

现在你想把"bad"和"worst"换成"good"和"best"。你可以使用

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

这可能会有帮助:

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'))

如果我们有2个数据帧,下面的工作

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

我们将DF1的名称更改如下

 colnames(DF1)<- colnames(DF2)

我的列名如下

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

我想更改Class和Sex的列名

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

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

使用colname函数更改列名。

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

更改数据帧列名

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

使用data.table的一个选项:

library(data.table)


setDT(dataframe)


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