web-dev-qa-db-ja.com

選択された列のみを持つデータフレームで一意

100列を超えるデータフレームがあり、2列のみを比較することで一意の行を見つけたいと思います。私はこれが簡単なものであることを望んでいますが、uniqueduplicatedを自分で操作することはできません。

以下では、idとid2のみを使用して一意にしたいと思います。

data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))

id id2 somevalue
1   1         x
1   1         y
3   4         z

どちらかを入手したい:

id id2 somevalue
1   1         x
3   4         z

または:

id id2 somevalue
1   1         y
3   4         z

(どの一意の行を保持するかは好みがありません)

62
Ina

重複しない列のどの値を選択しても問題ない場合、これは非常に簡単です。

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
  id id2 somevalue
1  1   1         x
3  3   4         z

duplicated呼び出しの内部では、datから重複したくない列のみを渡します。このコードは、あいまいな値のfirstを常に自動的に選択します。 (この場合、x。)

102
joran

unique()を使用:

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])),]
13
Gary Feng

以下に、列idおよびid2に基づいて重複しない行を保持するdplyrオプションをいくつか示します。

library(dplyr)                                        
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)
10
sbha

@Joranのコードのマイナーアップデート。
以下のコードを使用すると、あいまいさを回避し、2つの列の一意性のみを取得できます。

dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]
1
Vaya Ashish