【问题标题】:Changing Column Names Except For The First Two Columns更改除前两列之外的列名
【发布时间】:2018-04-24 17:01:45
【问题描述】:

我正在尝试使用 R 中的 colnames() 函数更改列名,但我想保持前两个列名不变。例如,

    x <- c("A", "B", "C")
    x2 <- c( "D", "E", "F")
    ch <- c("G", "H", "I")
    ch2 <- c("J", "K", "L")
    ch3 <- c("M", "N", "O")

    df <- data.frame(x, x2, ch, ch2, ch3)

   x  x2  ch  ch2 ch3
1  A   D   G   J   M
2  B   E   H   K   N
3  C   F   I   L   O

我只想在这些列前添加“x_”以便使用

colnames(df) <- paste("x", colnames(df), sep = "_")

这会将他们的名字改为

   x_x  x_x2  x_ch  x_ch2 x_ch3
1   A     D     G     J     M
2   B     E     H     K     N
3   C     F     I     L     O

所有列名都更改了,这不是我想要做的。如何在更改其余列名的同时保持前两个列名不变?我尝试了各种不同的方法,但到目前为止,我只能保持前两个列名不变,其余列名被删除。如果可能的话,我想只使用 dpylr 或只使用基本的 R。提前谢谢你!

【问题讨论】:

  • names(df)[-(1:2)] &lt;- paste("x", names(df)[-(1:2)], sep="_")

标签: r dplyr


【解决方案1】:

我们可以使用来自dplyrrename_at

library(dplyr)
df %>% 
   rename_at(vars(matches("ch")), ~ paste0("x_", .))
#  x x2 x_ch x_ch2 x_ch3
#1 A  D    G     J     M
#2 B  E    H     K     N
#3 C  F    I     L     O

【讨论】:

  • @Will Park 只要确保在附加dplyr 之前运行library(plyr)。但这绝对是更优雅的解决方案,学习这些包的功能将非常值得您花时间
  • 如果你改用library(tidyverse),它会以正确的顺序加载它们(加上他们整洁的朋友),所以你不再需要担心plyrdplyr之间的屏蔽函数
  • 谢谢,非常感谢。这肯定更优雅!
【解决方案2】:

不要将该函数应用于所有colnames,而是使用[] 表示法将其应用于列的子集

colnames(df)[3:ncol(df)] <- paste("x", colnames(df)[3:ncol(df)], sep = "_")

欢迎来到 StackOverflow!

【讨论】:

  • 太棒了,这很好用。并感谢您的欢迎!
【解决方案3】:

指定要添加字符串的起始列号:

x <- c("A", "B", "C")
x2 <- c( "D", "E", "F")
ch <- c("G", "H", "I")
ch2 <- c("J", "K", "L")
ch3 <- c("M", "N", "O")

df <- data.frame(x, x2, ch, ch2, ch3)

colnames(df)[3:ncol(df)] <- paste("x", colnames(df[3:ncol(df)]), sep = "_")

df

【讨论】:

  • 完美运行,非常感谢!
【解决方案4】:

在基础 R 中:

i <- startsWith(names(df),"ch")
names(df)[i] <- paste0("x_",names(df)[i])
#   x x2 x_ch x_ch2 x_ch3
# 1 A  D    G     J     M
# 2 B  E    H     K     N
# 3 C  F    I     L     O

【讨论】:

    【解决方案5】:

    R 基础中的另一种替代方法:sub

    > names(df) <- sub("(^ch.*)","x_\\1", names(df))
    > df
      x x2 x_ch x_ch2 x_ch3
    1 A  D    G     J     M
    2 B  E    H     K     N
    3 C  F    I     L     O
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2022-09-20
      • 2013-08-08
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多