我有一个名为"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()
函数,但没有效果。
谁能帮我解决这个问题?
使用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"
这个错误是由"智能引号"(或不管它们叫什么)引起的。 这里的教训是,"不要在一个将引号转换为智能引号的'编辑器中写你的代码"。
names(newprice)[1]<-paste(“premium”) # error
names(newprice)[1]<-paste("premium") # works
另外,你不需要paste("premium")
(对paste
的调用是多余的),在<-
周围加上空格是个好主意,以避免混淆(例如x <-10; if(x<-3) "hi" else "bye" x
)。
新推荐的方法是使用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"
分配新的变量名。
如果你需要一次性重命名多个列,而你只知道旧的列名,你可以使用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
。
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
现在你想改变"坏"。 和"最坏"。 改为"good"和"best"。 和"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
只是为了纠正和稍微扩展Scott Wilson的回答。
你也可以在data.frames上使用data.table的setnames
函数。
不要期望操作速度加快,但你可以期望 "setnames "对内存消耗更有效,因为它通过引用更新列名。
这可以通过address
函数来跟踪,见下文。
<!--语言。 r--!>
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)
所以,如果你的内存达到极限,可以考虑用这个来代替。
有几个选项是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
这可能会有帮助。
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'))