2017-01-20 2 views
1

Ich möchte Zeilen basierend auf dem wiederholten Element in der ersten Spalte entfernen, aber auch die zweite Spalte beibehalten. Jeder der Werte, die dem wiederholten Element in der zweiten Spalte zugeordnet sind, kann ich verwenden.Wiederholtes Element einmal und der gesamte Datenrahmen in r behalten

Eingang:

df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6) 

Erwartete Ausgabe:

col1 col2 
a 1 
b 4 

oder

col1 col2 
    a 2 
    b 5 

usw.

Bisher versuchte, mit folgendem Befehl aber nicht hält gesamten Datenrahmen :

df[(duplicated(df$col1)),] 

Antwort

2

Mit dplyr können wir group_bycol1 und dann nur diejenigen Gruppen, die mit slice

library(dplyr) 
df %>% 
    group_by(col1) %>% 
    filter(n() > 1) %>% 
    slice(1) 

# col1 col2 
# <fctr> <int> 
#1 a  1 
#2 b  4 
von Gruppe mehr als einmal und bekommen Sie die erste Zeile auftreten

Zum zweiten Reihe aus jeder Gruppe erhalten wir können nur

df %>% 
    group_by(col1) %>% 
    filter(n() > 1) %>% 
    slice(2) 

# col1 col2 
# <fctr> <int> 
#1  a  2 
#2  b  5 

Wir können auch die row_number Funktion in dplyr

df %>% 
    group_by(col1) %>% 
    filter(n() > 1) %>% 
    filter(row_number() == 1) 
verwenden
2

folgende tun soll, was Sie wollen:

> df = data.frame(col1 = c("a", "a", "a", "b", "b", "c"), col2 = 1:6) 
> t <- table(df[,1]) 
> df[match(names(t[t>1]),df[,1]),] 
    col1 col2 
1 a 1 
4 b 4 

Kurze Erläuterung: table(...) zählt die Anzahl, wie oft jedes Element in der ersten Spalte apears. names(t[t>1]) wählt nur diejenigen aus, die mindestens zweimal vorkommen, und match(...) gibt den (ersten) Index dieser Elemente an. Schließlich werden die Zeilen ausgewählt, die diesen Indizes entsprechen.

+0

Danke @ Jonathan, ich will auch nicht die 6. Reihe. Sehen Sie meine erwartete Ausgabe. –

+0

Sie wollen also nur diejenigen, die zwei oder mehrere Male wiederholt werden? –

+0

Ja genau. @ Jonathan –

0

Wir können dies mit data.table tun. Konvertieren Sie die ‚data.frame‘ auf ‚data.table‘ (setDT(df)), gruppiert nach ‚col1‘, if die Anzahl der Zeilen größer als 1 sind, erhalten die erste Reihe

library(data.table) 
setDT(df)[, if(.N>1) head(.SD, 1) , col1] 
# col1 col2 
#1: a 1 
#2: b 4 

Wenn wir den zweiten Wert benötigen

setDT(df)[, if(.N>1) .SD[2] , col1] 
# col1 col2 
#1: a 2 
#2: b 5 

Oder mit dplyr

library(dplyr) 
df %>% 
    group_by(col1) %>% 
    filter(n()>1 & row_number()==1) 
# col1 col2 
# <fctr> <int> 
#1  a  1 
#2  b  4