首页 > 解决方案 > 如何在 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 删除重复的列,而不用查看控制台来查看新的重复名称?

标签: rdplyrreadr

解决方案


在 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(.))))

推荐阅读