【问题标题】:Add a prefix to column names为列名添加前缀
【发布时间】:2013-01-30 02:13:41
【问题描述】:

在阅读以下helpfile 时,应该可以在列名中添加前缀:

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)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我将为这个问题添加一个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")
    

    【讨论】:

      【解决方案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 package (v0.3.0) 于 2020 年 10 月 21 日创建

      【讨论】:

        【解决方案3】:

        更新的tidyverse 方法(带有dplyr 1.0.2)使用rename_with(),因为rename_all() 函数已被取代。

        iris %>% rename_with( ~ paste("Sub", .x, sep = "_"))
        

        【讨论】:

        • 在我看来,这显然是解决问题的最简单和最干净的方法。它也适用于 paste(.x, "Post", sep = "_") 的“后缀”
        【解决方案4】:

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

        do.NULL:合乎逻辑。如果FALSE 且名称为NULL,则创建名称。

        注意该描述中的。你的名字不再是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
        

        【讨论】:

        • +1,据我了解,prefix 仅用于为没有名称的列创建名称。
        • 确实,我应该更仔细地阅读这句话,谢谢!
        • 如何将 paste() 粘贴到 colnames 的末尾?
        • colnames(m2) &lt;- paste(colnames(m2), "sub", sep = "_")
        • 有没有使用dplyr的答案...我想将此作为我的一个函数的最后一步
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 2011-03-04
        • 2015-12-05
        • 2022-10-18
        相关资源
        最近更新 更多