【问题标题】:delete duplicated column dplyr删除重复的列 dplyr
【发布时间】:2016-08-03 16:23:07
【问题描述】:

今天早上在对数据框进行一些分析时,由于存在重复的列名,我遇到了一个错误。我试图找到一个专门使用 dplyr 的解决方案,但我找不到任何可行的方法。这里有一个例子来说明这个问题。具有重复列名的数据框。

x <- data.frame(matrix(c(1, 2, 3),
                c(2,2,1),nrow=2,ncol=3))
colnames(x) <- c("a", "a", "b")

当我尝试使用 select 命令删除第一列时出现错误

x %>%
  select(-1)%>%filter(b>1)

Error: found duplicated column name: a

我可以使用传统索引和使用 dplyr 按值过滤轻松摆脱列

x<-x[,-1]%>%filter(b>1)

产生所需的输出

> x
  a b
1 2 3
2 2 3

关于如何仅使用 dplyr 语法来执行此操作的任何想法?

【问题讨论】:

  • 那么在基础 R 中,“正确”的方式可能是 x[!duplicated(names(x), fromLast=TRUE)]。只需找到一种方法将其放入 dplyr 的 select 动词中即可。嗯,即使x %&gt;% select(2,3) 也不起作用,在查看select 子句之前抱怨LHS。我称之为错误。粗略的解决方法:x %&gt;% do(.[!duplicated(names(.), fromLast=TRUE)])
  • 我通常只使用make.names 合法地重命名所有内容。
  • 如果你仔细研究一下,我想你会发现这里的祸根在于 plyr 和 dplyr 使用列名来选择数据。这要求列具有唯一的名称,它不按名称和内容进行选择。基本包使用索引,它可以在不考虑命名范式的情况下工作。这是包装的限制,大部分时间都值得限制。
  • 是的,我得出了这个结论,有趣的是,您不能删除同名的列,但实际上可以创建同名的列,为了保持一致,这也应该引发错误消息.

标签: r dplyr


【解决方案1】:

这可以利用make.names 的行为。不知道我是不是在这里作弊,但似乎主要是利用 dplyr 的功能。

x %>% 
    setNames(make.names(names(.), unique = TRUE)) %>% 
    select(-matches("*\\.[1-9]+$"))

【讨论】:

    【解决方案2】:

    如果你想完全摆脱第一列,我会这样做

    x <- x[, c(2:3)]
    

    或者你可以重命名它

    colnames(x)[1] <- "a.1"
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2018-04-07
      • 2016-10-04
      • 2021-09-24
      • 2020-08-20
      • 2014-05-22
      • 2020-07-06
      • 2014-12-27
      • 2018-01-29
      相关资源
      最近更新 更多