r - 如何在 tidyverse 中删除 tibble 中的重复列
问题描述
假设我的数据有两个相同的列,称为 SYC SJ Equity。当我使用 base 并将其导入 R 并将其read.csv()
设置check.names
为 时FALSE
,将使用具有相同名称的两列导入数据。然后我可以像这样删除重复的列:
df <- df %>%
do(.[!duplicated(names(.))])
如果我使用读取器中的read_csv()
函数导入数据,则重复列以“SYC SJ Equity_1”的形式获取列名。然后我可以执行以下操作来删除重复的列
df <- df %>%
select(-contains("_"))
但是,如果数据以某种.xlsx
格式在工作表中,并且我使用包中的read_excel()
函数readxl
,则重复的列将导入为:
New names:
* `SYC SJ Equity` -> `SYC SJ Equity...406`
* `SYC SJ Equity` -> `SYC SJ Equity...407`
在这种情况下,两个列都被重命名,而使用 时read_csv()
,只有额外的实例被重命名。在这种情况下,我必须匹配整个字符串才能删除重复的列。我不知道将哪些数字分配给重复的列。我假设它基于列索引?此外,即使使用read_csv()
导入,如果我的列在原始数据中的名称中自然都有下划线,我的解决方案也将不起作用。所以我的问题是,如何删除 tidyverse 中存储在 tibbles 中的数据的重复列?这很容易使用基数 R,使用duplicated()
. 但这不适用于 tidyverse 的 tibbles。我明白那个dplyr
动词按列名而不是按列索引选择,因此列名总是必须不同。但是有没有办法总是用 tidyverse 删除重复的列,而不用查看控制台来查看新的重复名称?
解决方案
在 Ronak 提供的答案的基础上,如果您想在 中执行此操作dplyr
,那么您可以将他提供的解决方案与select_if
.
library(dplyr)
df <- data.frame("x" = runif(3),
"SYC SJ Equity...406" = c("a", "a", "b"),
"SYC SJ Equity...407" = c("a", "a", "b"),
"y" = runif(3))
df %>%
select_if(!duplicated(sub("\\.\\.\\..*", "", names(.))))
推荐阅读
- asp.net - 如何在 asp 文本框字段中应用 url 验证器
- r - 使用 --enable-R-shlib 安装 R 3.5.0
- java - BIRT Report Designer 慢:多核处理器上只有一个线程?
- javascript - Fancytree activateKey 设置焦点然后根据键滚动到顶部
- hadoop - HDInsight Oozie 4.2.0.2.5 Spark2 Action Jackson 碰撞
- ios-simulator - Xcode 9.3 IOS 模拟器屏幕截图总是给出相同的尺寸
- c# - 在我的数据库中更改 FK 的级联行为时需要更新模型吗?
- apache-camel - 如何在 apache camel 中为 http4 组件添加负载平衡。对于下面的 http4 组件代码检查
- javascript - 制作表单文本 URLEncoded 格式
- sql - 根据日历表中的下一个工作日选择