2016-08-03 23 views
8

今朝、重複した列名の存在によりエラーが発生しました。私は排他的にdplyrを使って解決策を見つけようとしましたが、何も見つけられませんでした。この問題を説明する例を次に示します。列名が重複しているデータフレーム。私はselectコマンドを使用して最初の列を削除しようとすると私は値でフィルタする伝統的なインデックス作成と使用dplyrを使用して簡単に列を取り除くことができ、エラー重複列を削除する

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

Error: found duplicated column name: a 

を取得

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

所望の出力を生成し
x<-x[,-1]%>%filter(b>1) 

> x 
    a b 
1 2 3 
2 2 3 

dplyr文法だけを使ってこれを実行する方法に関するアイデアはありますか?

+2

の名前を変更することができ、最初の列を取り除くしたい場合は、「右」 wayはおそらく 'x [!duplicated(names(x)、fromLast = TRUE)]'です。それをdplyrの 'select'動詞に投げる方法を見つけてください。また、 'x%>%select(2,3)'でさえ、 'select'節を見る前にLHSについて泣いています。私はそれをバグと呼ぶだろう。 'x%>%do(。[duplicated(names、.Last = 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)] 

を行うだろうまたは代わりにあなたがさて、ベースRでそれを

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