2017-10-10 13 views
0
df <- data.frame(id = c(1, 1, 1, 2, 2), 
       gender = c("Female", "Female", "Male", "Female", "Male"), 
       variant = c("a", "b", "c", "d", "e")) 
> df 
    id gender variant 
1 1 Female  a 
2 1 Female  b 
3 1 Male  c 
4 2 Female  d 
5 2 Male  e 

データセット内のgender列に従って、data.frameの重複行を削除したいとします。私は同じ質問があることを知っている(here)が、ここでの違いは、各サブセットが一意のidによって定義されているデータセットの各サブセット内で重複する行を削除したいということです。R:列単位で行を削除する方法

私の望ましい結果がこれです:私は次のことを試してみたし、それが動作しますが、これを行うための、よりクリーンで効率的な方法があります場合、私は思ったんだけど

id gender variant 
1 1 Female  a 
3 1 Male  c 
4 2 Female  d 
5 2 Male  e 

?以下のようにsubsetを使用してこれを行うの

out = list() 
for(i in 1:2){ 
    df2 <- subset(df, id == i) 
    out[[i]] <- df2[!duplicated(df2$gender), ] 
} 
do.call(rbind.data.frame, out) 
+1

[dplyrを使用して重複する行を削除する](https://stackoverflow.com/questions/22959635/remove-duplicated-rows-using-dplyr)または[ddplyで重複する行を削除する](https:// stackoverflow .com/questions/23079248/removal-duplicate-rows-with-ddply) –

答えて

1
df[!duplicated(df[c("id","gender")]),] 

#  id gender variant 
# 1 1 Female  a 
# 3 1 Male  c 
# 4 2 Female  d 
# 5 2 Male  e 

別の方法:ここで

subset(df, !duplicated(subset(df, select=c(id, gender)))) 

# id gender variant 
# 1 1 Female  a 
# 3 1 Male  c 
# 4 2 Female  d 
# 5 2 Male  e 
0

はあなたが興味を持っている場合はdplyrベースのソリューションです

Gregorの提案を含めるように編集)
library(dplyr) 
group_by(df, id, gender) %>% slice(1) 

#> # A tibble: 4 x 3 
#> # Groups: id, gender [4] 
#>  id gender variant 
#> <dbl> <fctr> <fctr> 
#> 1  1 Female  a 
#> 2  1 Male  c 
#> 3  2 Female  d 
#> 4  2 Male  e 

variantの値を削除する必要がある場合は、arrange機能も使用する価値があります。

関連する問題