我有一个名为“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()函数,但没有用。
有人能帮我弄清楚吗?
新的推荐方法是使用setNames函数。看到
? setNames。由于这将创建data.frame的新副本,因此如果您希望这样做,请确保将结果分配给原始data.frame。
data_frame <- setNames(data_frame, c("premium","change","newprice"))
如果您以以前的答案中建议的某些方式使用冒号,那么新版本的R将会给出警告。
如果这是一个数据。表,您可以使用数据。表函数setnames,它可以通过引用修改特定的列名或单个列名:
setnames(data_table, "old-name", "new-name")
更正一下,稍微扩展一下斯科特·威尔逊的回答。
你可以使用数据。表的setnames也在data.frames上起作用。
不要期望操作速度加快,但是您可以期望setnames在内存消耗方面更有效,因为它通过引用更新列名。这可以跟踪地址功能,见下文。
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)
所以,如果你的记忆力快到极限了,你可以考虑用这个来代替。
如果您只知道旧的列名,但需要一次重命名多个列,则可以使用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
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