2015-03-05 4 views
1

У меня есть dataframe объект («ред»), как это:Subset dataframe путем удаления всех уникальных строк

 C1   C2 C3  C4  C5 C6   C7 C8 C9 
1 5432750 11/05/2007 2007 354140 2045249 A 11/07/1951 F M 
2 6040226 07/01/2008 2008 354140 2755130 B 25/05/1969 M N 
3 6019750 05/05/2008 2008 354140 2755130 C 29/01/1999 M O 
4 6082148 09/05/2008 2008 354220 2751143 D 22/06/1990 F P 
5 6082149 10/05/2008 2008 354220 2751143 D 22/06/1990 F P 
6 6082150 11/05/2008 2008 354220 2751143 D 22/06/1990 F P 
7 5613588 10/05/2009 2009 354140 2755130 F 06/11/1933 F Q 
8 7291153 07/07/2010 2010 354140 2755130 H 29/09/1943 F R 
9 5663206 05/11/2010 2010 354140 2755130 I 31/08/1939 M S 
10 7240738 05/10/2011 2011 354140 2755130 J 03/10/1977 F T 
11 7798961 08/02/2012 2012 354140 2755130 K 02/10/1963 M U 
12 7798962 09/02/2012 2012 354140 2755130 K 02/10/1963 M U 

Мне нужно подмножество этого dataframe, удаляя все уникальные строки и сохранить все повторяющиеся из них. Это включает в себя «оригинальную» строку, то есть первое появление, а не только его повторения вдоль фрейма данных.

я был близок, чтобы получить желаемый объект dataframe с помощью:

ed[duplicated(ed[,c('C6','C7','C8','C9')]),] 

Однако опускает первый внешний вид, что-то, что имеет смысл, так как первый внешний вид не является дубликатом, а не захвачен дублирующая функция.

Я также попытался:

ed[!unique(ed[,c('C6','C7','C8','C9')]),] 

Но это не работает.

+1

Вы ищете 'изд [дублируется (изд [, с ('C6', 'С7', 'С8', 'C9')]) | duplicated (ed [, c ('C6', 'C7', 'C8', 'C9')], fromLast = TRUE),] '? –

ответ

1

Использование dplyr:

#dummy data 
df <- read.table(text="  C1   C2 C3  C4  C5 C6   C7 C8 C9 
1 5432750 11/05/2007 2007 354140 2045249 A 11/07/1951 F M 
       2 6040226 07/01/2008 2008 354140 2755130 B 25/05/1969 M N 
       3 6019750 05/05/2008 2008 354140 2755130 C 29/01/1999 M O 
       4 6082148 09/05/2008 2008 354220 2751143 D 22/06/1990 F P 
       5 6082149 10/05/2008 2008 354220 2751143 D 22/06/1990 F P 
       6 6082150 11/05/2008 2008 354220 2751143 D 22/06/1990 F P 
       7 5613588 10/05/2009 2009 354140 2755130 F 06/11/1933 F Q 
       8 7291153 07/07/2010 2010 354140 2755130 H 29/09/1943 F R 
       9 5663206 05/11/2010 2010 354140 2755130 I 31/08/1939 M S 
       10 7240738 05/10/2011 2011 354140 2755130 J 03/10/1977 F T 
       11 7798961 08/02/2012 2012 354140 2755130 K 02/10/1963 M U 
       12 7798962 09/02/2012 2012 354140 2755130 K 02/10/1963 M U") 
require(dplyr) 
df %>% 
    group_by(C6,C7,C8,C9) %>% 
    filter(n() > 1) 

#result 
df 
#  C1   C2 C3  C4  C5 C6   C7 C8 C9 
# 1 6082148 09/05/2008 2008 354220 2751143 D 22/06/1990 F P 
# 2 6082149 10/05/2008 2008 354220 2751143 D 22/06/1990 F P 
# 3 6082150 11/05/2008 2008 354220 2751143 D 22/06/1990 F P 
# 4 7798961 08/02/2012 2012 354140 2755130 K 02/10/1963 M U 
# 5 7798962 09/02/2012 2012 354140 2755130 K 02/10/1963 M U 
+1

Хммм, почему не просто 'df%>% group_by (C6, C7, C8, C9)%>% фильтр (n()> 1)'? –

+0

Я проходил шаг за шагом, согласен, шаги 'mutate select' можно отбросить. Все еще не полностью понимают трюки dplyr. – zx8754

+1

Хотя это будет, вероятно, ужасно неэффективно для большого набора данных по сравнению с 'duplicated' –

Смежные вопросы