100列を超えるデータフレームがあり、2列のみを比較することで一意の行を見つけたいと思います。私はこれが簡単なものであることを望んでいますが、unique
やduplicated
を自分で操作することはできません。
以下では、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
(どの一意の行を保持するかは好みがありません)
重複しない列のどの値を選択しても問題ない場合、これは非常に簡単です。
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。)
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")])),]
以下に、列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)
@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")]