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

有人能帮我弄清楚吗?


当前回答

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

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

此外,你不需要粘贴(“premium”)(调用粘贴是多余的),并且在<-周围放置空格以避免混淆(例如x <- -10;如果(x < 3)"hi" else "bye";x)。

其他回答

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

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

我们将DF1的名称更改如下

 colnames(DF1)<- colnames(DF2)

与其他相似:

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

相当简单,易于修改。

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

新的推荐方法是使用setNames函数。看到 ? setNames。由于这将创建data.frame的新副本,因此如果您希望这样做,请确保将结果分配给原始data.frame。

data_frame <- setNames(data_frame, c("premium","change","newprice"))

如果您以以前的答案中建议的某些方式使用冒号,那么新版本的R将会给出警告。

如果这是一个数据。表,您可以使用数据。表函数setnames,它可以通过引用修改特定的列名或单个列名:

setnames(data_table, "old-name", "new-name")

Try:

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