将列重命名为Y X1 X2 X3 X4 .. XN

时间:2019-09-27 22:03:22

标签: r

我有一些数据,例如:

data(iris)

我想重命名列,以使SpeciesY变量,而 all 其他变量是预测变量。

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

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 = ""))

预期的输出将是别名:

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

4 个答案:

答案 0 :(得分:2)

我正在重新安排您的步骤,以避免在创建名称时进行任何子设置。而是在知道要将其更改为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

答案 1 :(得分:2)

出了什么问题

您的代码中的错误是它假定第二个.(在匿名函数中)是一个小头,而实际上却是一个字符向量。因此,ncol(.)是不合适的,而应该是length(.)。另外,不需要seq()并根据您的要求输出,它应该从1开始。最后,您可以使用:

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

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

iris %>%
  select(Species, everything()) %>% # move the Y variable to the "front"
  rename(Y = 1) %>%
  rename_at(vars(-1), ~ str_c("X", seq_along(.)))

答案 2 :(得分:0)

您可以直接设置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<-`在管道中作为函数起作用: use %>% with replacement functions like colnames()<-

答案 3 :(得分:0)

具有基本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