r - 使用 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(.)])
这个解决方案不能一概而论。欢迎更好的解决方案。
解决方案
如果这是基于用户输入“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))])
推荐阅读
- perl - hashref 查找中的语法错误,看不到原因
- javascript - 在运行克隆功能之前检查一个元素是否已经被克隆
- .net - 在 Godaddy 中部署 Angular 7 和 .Net 4.7 Web API
- php - 在 ubuntu 服务器上使用 VueJS SPA 前端部署 Laravel 后端的问题
- sql - 如何为连续组合提供行号并将其复制以进行重复
- android - 可以在安卓上使用 Webview 浏览 Youtube 频道吗?
- python - 从 iterrows() 到更快的“嵌套-Pythonish-循环”
- firebase - Firebase web logout()不重定向到索引页面
- wordpress - WooCommerce 钩子 - 获取触发器
- vsto - Outlook VSTO 加载项 - 加载错误 80080005