【问题标题】:renaming columns to Y X1 X2 X3 X4 .. XN将列重命名为 Y X1 X2 X3 X4 .. XN
【发布时间】:2020-01-28 04:55:23
【问题描述】:

我有一些数据,例如:

data(iris)

我想重命名列,使SpeciesY 变量,所有其他变量都是预测变量。

我目前拥有的并没有给我想要的结果。

iris %>%
  select(Species, everything()) %>% # move the Y variable to the "front"
  rename(Y = 1) %>%
  rename_at(vars(2:ncol(.)), ~ paste("X", seq(2:ncol(.)), sep = ""))

预期的输出将是 colnames:

Y, X1, X2, X3, X4, X5... XN

【问题讨论】:

  • select(iris, Species, everything()) %>% setNames(c("Y", paste0("X", seq_along(colnames(.))[-1]-1)))
  • @divibisan 该帖子不涉及动态创建名称
  • 但是提问者似乎知道如何动态创建名称——他们的那部分代码可以工作

标签: r


【解决方案1】:

我正在重新安排您的步骤,以避免在创建名称时进行任何子集化。相反,将第一列命名为 X0 知道您将其更改为 Y

library(dplyr)

iris %>%
  select(Species, everything()) %>% 
  setNames(paste0("X", seq_along(.) - 1)) %>%
  rename(Y = 1) %>%
  head()
#>        Y  X1  X2  X3  X4
#> 1 setosa 5.1 3.5 1.4 0.2
#> 2 setosa 4.9 3.0 1.4 0.2
#> 3 setosa 4.7 3.2 1.3 0.2
#> 4 setosa 4.6 3.1 1.5 0.2
#> 5 setosa 5.0 3.6 1.4 0.2
#> 6 setosa 5.4 3.9 1.7 0.4

【讨论】:

    【解决方案2】:

    出了什么问题

    您的代码中的错误是它假定第二个.(在匿名函数中)是一个tibble,而实际上它实际上是一个character 向量。因此,ncol(.) 是不合适的,而应该是length(.)。此外,不需要seq() 并且给定您请求的输出,它应该从 1 开始。最后,您可以:

    iris %>%
      select(Species, everything()) %>%
      rename(Y = 1) %>%
      rename_at(vars(2:ncol(.)), ~ paste("X", 1:length(.), sep = ""))
    

    其他答案提供了表达此操作的替代方法。一个可能更干净的版本是

    iris %>%
      select(Species, everything()) %>%
      rename(Y = 1) %>%
      rename_with(~ str_c("X", seq_along(.)), -1)
    

    【讨论】:

      【解决方案3】:

      您可以直接设置colnames,而不是使用有时很挑剔的rename 函数:

      iris %>%
          select(Species, everything()) %>% # move the Y variable to the "front"
          `colnames<-`(c('Y', paste("X", seq(2:ncol(.)), sep = ""))) %>%
          head
      
             Y  X1  X2  X3  X4
      1 setosa 5.1 3.5 1.4 0.2
      2 setosa 4.9 3.0 1.4 0.2
      3 setosa 4.7 3.2 1.3 0.2
      4 setosa 4.6 3.1 1.5 0.2
      5 setosa 5.0 3.6 1.4 0.2
      6 setosa 5.4 3.9 1.7 0.4
      

      这个问题解释了为什么`colnames&lt;-` 在管道中作为一个函数工作: use %>% with replacement functions like colnames()<-

      【讨论】:

        【解决方案4】:

        基于 r 函数的解决方案:

        colnames(iris) <- c("X1", "X2", "X3", "X4", "Y") # rename columns
        iris[,c(5,1,2,3,4)] # reorder 
        
                    Y  X1  X2  X3  X4
         #  1  setosa 5.1 3.5 1.4 0.2
         #  2  setosa 4.9 3.0 1.4 0.2
         #  3  setosa 4.7 3.2 1.3 0.2
         #  4  setosa 4.6 3.1 1.5 0.2
         #  5  setosa 5.0 3.6 1.4 0.2
        

        【讨论】:

          猜你喜欢
          • 2018-09-24
          • 2015-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-04
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          相关资源
          最近更新 更多