69

阅读以下帮助文件时,应该可以为列名添加前缀:

colnames(x, do.NULL = TRUE, prefix = "col")

以下对我不起作用。我在这里做错了什么?

m2 <- cbind(1,1:4)
colnames(m2, do.NULL = FALSE)
colnames(m2) <- c("x","Y")
colnames(m2) <- colnames(m2, prefix = "Sub_")
colnames(m2)
4

4 回答 4

111

您误读了帮助文件。这是要查看的论点:

do.NULL: 合乎逻辑。如果FALSE和 names 是NULL,则创建名称。

请注意该描述中的and。你的名字不再是NULL,所以使用前缀是行不通的。

相反,使用这样的东西:

> m2 <- cbind(1,1:4)
> colnames(m2) <- c("x","Y")
> colnames(m2) <- paste("Sub", colnames(m2), sep = "_")
> m2
     Sub_x Sub_Y
[1,]     1     1
[2,]     1     2
[3,]     1     3
[4,]     1     4
于 2013-02-14T10:04:42.897 回答
49

我将为tidyverse这个问题添加一种方法,您可以为所有列名添加后缀和前缀。下面在dplyr管道中添加前缀。

dplyr 1.0.2 及更高版本

library(dplyr)
df <- data.frame(x = c(1, 2), y = c(3, 4))

## Adding prefixes
df %>% rename_with( ~ paste0("a", .x))

## Adding suffixes
df %>% rename_with( ~ paste0(.x, "a"))

如果你想有下划线之类的分隔符,你也可以使用paste参数sep


dplyr 1.0.2 更新前

library(dplyr)
df <- data.frame(x = c(1, 2), y = c(3, 4))
df %>% rename_all( ~ paste0("a", .x))

添加后缀更容易。

df %>% rename_all(paste0, "a")
于 2019-04-14T23:52:20.603 回答
15

更新的tidyverse方法 (with dplyr 1.0.2)rename_with()用作rename_all()函数已被取代。

iris %>% rename_with( ~ paste("Sub", .x, sep = "_"))
于 2020-08-31T04:41:22.263 回答
2

stats::setNames功能对此工作得很好,实际上比替代品要快得多。


iris.dt <- data.table::as.data.table(iris)

microbenchmark::microbenchmark(
  
  base = colnames(iris) <- paste("Sub", colnames(iris), sep = "_"),
  stats = setNames(iris, paste("Sub", colnames(iris), sep = "_")), 
  dplyr = dplyr::rename_with(iris, ~ paste("Sub", .x, sep = "_")),
  datatable = data.table::setnames(iris.dt, paste("Sub", names(iris.dt), sep = "_"))
  
)
#> Unit: microseconds
#>       expr     min       lq       mean   median      uq        max neval cld
#>       base  11.094  16.2140   21.62408  19.2010  23.681     65.707   100   a
#>      stats   8.107  13.8670   17.40435  16.6405  19.841     39.254   100   a
#>      dplyr 786.772 842.8785 5236.67222 877.0130 984.959 402378.407   100   a
#>  datatable  40.961  49.9200   84.06237  62.2935  73.600    834.560   100   a

reprex 包(v0.3.0)于 2020 年 10 月 21 日创建

于 2020-10-20T21:11:09.917 回答