2016-08-03 116 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"