2016-08-03 98 views
8

今天早上,当用数据框做一些分析时,由于存在重复的列名,我得到了一个错误。我试图找到一个完全使用dplyr的解决方案,但我找不到任何可行的解决方案。这里是一个例子来说明这个问题。具有重复列名称的数据框。删除重复的列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语法来执行此操作的任何想法?

+2

井基础R,“右”方式可能是'x [!重复(names(x),fromLast = TRUE)]''。只要找到一种方法把它扔进dplyr的'select'动词。呵呵,即使'x%>%select(2,3)'也行不通,在看'select'语句之前抱怨LHS。我会打电话给一个错误。粗体解决方法:''%%%(。[!duplicated(names(。),fromLast = TRUE)])' – Frank

+0

我通常只使用'make.names'来合法地重命名所有内容。 – alistaire

+1

如果你深入挖掘,我认为你会发现邪恶的根源在于plyr和dplyr使用列名来选择数据。这需要列具有唯一的名称,它不会按名称和内容进行选择。基本软件包使用索引,这将起作用而不考虑命名范例。这是套餐的限制,大部分时间都值得这个限制。 – sconfluentus

回答

2

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

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

如果你想摆脱的第一列的完全我只想做

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

或者你也可以将其重命名

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