我有一些数据,例如:
data(iris)
我想重命名列,以使Species
是Y
变量,而 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
答案 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