【问题标题】:How to delete duplicated columns in a tibble in the tidyverse如何在 tidyverse 中删除 tibble 中的重复列
【发布时间】:2020-01-27 15:56:16
【问题描述】:

假设我的数据有两个相同的列,称为 SYC SJ Equity。当我使用基础read.csv() 将其导入R 并将check.names 设置为FALSE 时,数据将使用具有相同名称的两列导入。然后我可以像这样删除重复的列:

df <- df %>% 
  do(.[!duplicated(names(.))])

如果我使用读取器中的read_csv() 函数导入数据,重复的列会以“SYC SJ Equity_1”的形式获取列名。然后我可以执行以下操作来删除重复的列

df <- df %>%
  select(-contains("_"))

但是,如果数据在.xlsx 格式的工作表中,并且我使用readxl 包中的read_excel() 函数,则重复的列将导入为:

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 删除重复的列,而不用查看控制台来查看新的重复名称?

【问题讨论】:

    标签: r dplyr readr


    【解决方案1】:

    或者select_ifstr_remove

    library(stringr)
    library(dplyr)
    df %>% 
        select_if(!duplicated(str_remove(names(.), '\\..*')))
    

    【讨论】:

      【解决方案2】:

      基于 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(.))))
      

      【讨论】:

        【解决方案3】:

        假设您没有任何名称实际上包含 3 个点 (...) 的列。我们可以将数据读入 R 并从名称中删除这 3 个点,使用 duplicated 查找重复名称并选择唯一列。

        df[, !duplicated(sub("\\.\\.\\..*", "", names(df)))]
        

        只是为了展示它在向量上的工作原理

        x <- c("y", "SYC SJ Equity...406", "SYC SJ Equity...407", "x")
        x[!duplicated(sub("\\.\\.\\..*", "", x))]
        #[1] "y"                   "SYC SJ Equity...406" "x"
        

        所以它保持 "x""y" 列不变,只选择第一个重复的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-25
          • 1970-01-01
          • 2020-07-06
          • 2020-03-04
          • 1970-01-01
          相关资源
          最近更新 更多