2017-10-10 68 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 

我試過以下,它的工作原理,但我不知道是否有這樣做的更清潔,更有效的方式?

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 /問題/ 23079248 /刪除重複的,行與 - 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的另一種方式:

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 

也可能使用arrange函數以及取決於哪些值variant應該被刪除。