首页 > 解决方案 > 使用 dplyr 有条件地设置列名

问题描述

我想根据列数设置列名。

例如,

#iris1 <- iris[,1:4]
if(ncol(iris)==4) colnames(iris) <- c("a","b","c","d")
if(ncol(iris)==5) colnames(iris) <- c("a","b","c","d","e")

我正在寻找一种使用 dplyr 管道的方法。像这样的东西:

iris1 %>%
  setNames(ifelse(ncol(.)==4,c("a","b","c","d"),c("a","b","c","d","e")))

更新: akrun 的回答给了我这个在这个特定用例中对我有用的想法。

cnames <- c("a","b","c","d","e")
iris1 %>% setNames(cnames[1:ncol(.)])

这个解决方案不能一概而论。欢迎更好的解决方案。

标签: rdplyr

解决方案


如果这是基于用户输入“n”,那么我们可以使用rename_at

library(dplyr)
n <- 4
iris %>%
     rename_at(seq_len(n), ~ letters[seq_len(n)])

可以包装成一个函数

rename_fn <- function(dat, n){
           dat %>%
             rename_at(seq_len(n), ~ letters[seq_len(n)])
 }

rename_fn(iris, 4)
rename_fn(iris, 5)

如果要更改数据集的所有列,那么更简单的选择是set_names

iris %>%
     set_names(cnames[seq_len(ncol(.))])

或在base R

setNames(iris, cnames[seq_len(ncol(iris))])

推荐阅读