我有一个名为“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()
函数,但无济于事。
有人可以帮我解决这个问题吗?
is.matrix
或 str
进行检查。
colnames(newprice)<- c("premium","change","newprice")
colnames(X)[2]
中的 2
。这通常不是一个好的做法,因为它对数据更改很敏感。如果您在此特定列之前向您的数据添加另一列怎么办?相反,请尝试 Hagos 提供的答案。
使用 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"
我用这个:
colnames(dataframe)[which(names(dataframe) == "columnName")] <- "newColumnName"
data.table::setnames(dataframe,'Old','New')
该错误是由“智能引号”(或其他名称)引起的。这里的教训是,“不要在将引号转换为智能引号的‘编辑器’中编写代码”。
names(newprice)[1]<-paste(“premium”) # error
names(newprice)[1]<-paste("premium") # works
此外,您不需要 paste("premium")
(对 paste
的调用是多余的),最好在 <-
周围放置空格以避免混淆(例如 x <- -10; if(x<-3) "hi" else "bye"; x
)。
尝试:
names(newprice)[1] <- "premium"
新的推荐方法是使用 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")
我有同样的问题,这段代码为我解决了。
names(data)[names(data) == "oldVariableName"] <- "newVariableName"
简而言之,此代码执行以下操作:
names(data)
查看数据框中的所有名称 (data
)
[names(data) == oldVariableName]
提取您想要重命名的变量名 (oldVariableName
),然后 <- "newVariableName"
分配新的变量名。
与其他类似:
cols <- c("premium","change","newprice")
colnames(dataframe) <- cols
相当简单且易于修改。
使用它通过 colname 函数更改列名。
colnames(newprice)[1] = "premium"
colnames(newprice)[2] = "change"
colnames(newprice)[3] = "newprice"
如果您只知道旧列名称时需要一次重命名而不是全部列,则可以使用 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
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
我的列名如下
colnames(t)
[1] "Class" "Sex" "Age" "Survived" "Freq"
我想更改 Class 和 Sex 的列名
colnames(t)=c("STD","Gender","AGE","SURVIVED","FREQ")
尝试:
names(newprice) <- c("premium", "change", "newprice")
只是为了更正和稍微扩展 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)
因此,如果您达到了内存限制,您可以考虑改用这个。
您可以通过以下方式进行编辑:
newprice <- edit(newprice)
并手动更改列名。
> locanatmodelset<-edit(locanatmodelset) Error in edit.data.frame(locanatmodelset) : can only handle vector and factor elements
这可能会有所帮助:
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)
使用 data.table
的一个选项:
library(data.table)
setDT(dataframe)
setnames(dataframe,'Old1','New1')
setnames(dataframe,'Old2','New2')
更改数据框列名
colnames(dataset)[colnames(dataset) == 'name'] <- 'newcolumnname'
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
是赋予列的新名称)。这真是令人沮丧。