2017-07-02 3 views
3

Ich mache etwas Codierung in R. Ich möchte die Zeilen anzeigen, die Duplikate für Spalten ID und NAME haben, aber unterschiedliche Werte für AGE haben.Extrahieren Sie Zeilen, die Duplikate für bestimmte Spalten haben, aber in einer anderen Spalte eindeutig sind.

Zum Beispiel habe ich diese Tabelle:

ID | NAME | AGE 
111|  Mark| 22 
222|  Anne| 21 
333| Chery| 30 
444| Megan| 16 
555| Charles| 37 
111|  Mark| 23 
222|  Anne| 22 
333| Chery| 30 
111|  Mark| 22 

Ab jetzt habe ich diesen Code:

readfile <- read.csv(file='/home/user/shane/names.csv') 
dat <- data.frame(ID=c(readfile$ID),NAME=c(readfile$NAME),AGE=c(readfile$AGE)) 
nam <- duplicated(dat[,c('ID','NAME)]) | duplicated(dat[,c('ID','NAME], fromLast = TRUE) 
readfile[nam,] 

Die Ausgabe sieht wie folgt aus:

ID | NAME | AGE 
111|  Mark| 22 
222|  Anne| 21 
333| Chery| 30 
111|  Mark| 23 
222|  Anne| 22 
333| Chery| 30 
111|  Mark| 22 

Ich möchte Die Ausgabe soll lauten:

Ich möchte die Spalten mit der ID = 333 entfernen, da sie den gleichen Wert in Age haben. hätte jemand einen Vorschlag?

+0

Ich bin verwirrt. Wie erreichen Sie die gewünschte Leistung? Durch Filtern des Originals oder des Objekts, in dem Duplikate herausgefiltert werden? Es gibt keine ID 33, nur 333. –

+0

Hallo Entschuldigung, wenn ich unklar bin. Es wäre das Objekt, wo du die Duplikate herausgefiltert hast. Dann würden alle Ages angezeigt, die nicht konsistent sind. zum Beispiel wenn das Alter bei gleicher ID und gleichem Namen 22,23,22 ist. Ich möchte, dass diese Zeilen angezeigt werden. Entschuldigung für mein Englisch. – shia1717

Antwort

6

ich gezwickt nur Code :)

dat <- data.frame(ID=c(111,222,333,444,555,111,222,333,111), NAME=c('Mark','Anne','Chery','Megan','Charles','Mark','Anne'‌​,'Chery','Mark'), AGE=c(22,21,30,16,37,23,22,30,22)) 
library(plyr) 
dat1 <- ddply(dat,.(ID,NAME, AGE),nrow) 
dat2 <- merge(dat1,dat,by=c("ID","NAME","AGE")) 
dat3 <- dat2[!(!duplicated(dat2[,1:2], fromLast=T) & !duplicated(dat2[,1:2])),] 
dat3[dat3$ID %in% dat3[dat3$V1==1,1],1:3] 

Hope this Hilfe!

(bearbeiten diese Lösung nach @ shia1717 erwähnte seine spezifische Anforderung - für mehr Details Kommentar siehe Abschnitt)

+0

Vielen Dank dafür! Ich habe nur Probleme, wenn ich eine weitere Zeile hinzufüge. (ID = c (111,222,333,444,555,111,222,333,111), NAME = c ('Mark', 'Anne', 'Chery', 'Megan', 'Charles', 'Mark', 'Anne', 'Chery', 'Mark'), ALTER = c (22,21,30,16,37,23,22,30,22)). Es würde die beiden IDs mit 111 herausnehmen, da das Alter 22,23,22 betragen würde. nur einer von ihnen ist übrig und ich möchte, dass alle von ihnen aufgenommen werden, da sie kein konsistentes Alter haben. Tut mir leid, ich bin nur neu in R. Wirklich zu schätzen alle Hilfe – shia1717

+0

'dat1 <- unique (dat [! (! Dupliziert (dat [, 1: 2], fromLast = T) &! Dupliziert (dat [, 1: 2 ])),]); dat1 [! (! Dupliziert (dat1 [, 1]) &! Dupliziert (dat1 [, 1], fromLast = T)),] – Prem

+0

habe dies versucht, aber nur 2 IDs mit 111 erscheint. Ich beabsichtige, die drei 111 zu zeigen, da sie nicht konsistent sind. Entschuldigung, wenn ich unklar bin. Danke fürs Helfen. ID | NAME | ALTER 111 | Zeichen | 22 222 | Anne 21 111 | Zeichen | 23 222 | Anne 22 111 | Zeichen | 22 – shia1717

1

A dplyr Lösung:

library(dplyr) 
dat %>% 
    group_by(ID, NAME) %>% 
    filter(n() > 1, sum(duplicated(AGE)) == 0) %>% 
    ungroup() 
# A tibble: 4 x 3 
    ID NAME AGE 
    <dbl> <fctr> <dbl> 
1 111 Mark 22 
2 222 Anne 21 
3 111 Mark 23 
4 222 Anne 22 

ich die Daten verwendet, mit freundlicher Unterstützung von @Prem zur Verfügung gestellt.

1

Hier Option mit data.table

library(data.table) 
setDT(dat)[, .SD[.N >1 & !sum(duplicated(AGE))], by = .(ID, NAME)] 
# ID NAME AGE 
#1: 111 Mark 22 
#2: 111 Mark 23 
#3: 222 Anne 21 
#4: 222 Anne 22 
Verwandte Themen