2012-01-17 2 views
0

У меня есть большой фрейм данных со следующими полями (пример данных).удалить дубликаты, сопоставленные по 3 столбцам

#dput(data) gives...

data <- structure(list(idNum = 1:11, personID = c(111L, 112L, 113L, 113L, 111L, 112L, 114L, 112L, 111L, 113L, 115L), Name = c("PETER PAN", "RUPERT BEAR", "LONG JOHN SILVER", "SILVER LONG JOHN", "PAN PETER", "BEAR RUPERT", "R BEAR", "RUPERT BEAR", "PETER PAN", "LONG J SILVER", "LJ SILVER "), DOB = c("1/01/2001", "2/01/2001", "3/01/2001", "3/01/2001", "1/01/2001", "2/01/2001", "10/01/2001", "2/01/2001", "1/01/2001", "1/01/2001", "5/01/2001"), date = c("12/01/2012", "12/01/2012", "14/01/2012", "12/01/2012", "14/01/2012", "11/01/2012", "10/01/2012", "16/01/2012", "10/01/2012", "16/01/2012", "10/01/2012" ), colour = c("RED", "BLUE", "RED", "GREEN", "YELLOW", "BLUE", "RED", "BLUE", "ORGANGE", "BLUE", "ORANGE"), firstName = c("PETER", "RUPERT", "LONG", "SILVER", "PAN", "BEAR", "R", "RUPERT", "PETER", "LONG", "LJ"), lastName = c("PAN", "BEAR", "SILVER", "JOHN", "PETER", "RUPERT", "BEAR", "BEAR", "PAN", "SILVER", "SILVER")), .Names = c("idNum", "personID", "Name", "DOB", "date", "colour", "firstName", "lastName" ), row.names = c(NA, -11L), class = "data.frame")

Параметр FirstName и LastName не в исходных данных. Формат имени в исходном наборе данных генерируется с помощью системы ввода свободного формата. Он содержит большое количество иностранных имен, поэтому клерки ввода данных не точно собирают имя и фамилию. Я полученный им с помощью:

data$firstName <-sapply(strsplit(data$Name, split=" "), head, 1) 
data$lastName <- sapply(strsplit(data$Name, split=" "), tail, 1) 

Что мне нужно достичь, это кадр подмножество данных, которое удаляет дубликаты совпавшие на PersonId, Имя и DOB таким образом, что значение возвращенного содержит большинство записей с самой последней датой для каждого уникального случая ,

То есть, я хотел бы вернуться строки 5, 7, 8, 10 и 11.

Я отделил имя и фамилию, потому что предполагалось, что она будет работать на начальном этапе добывающие случаях, когда lastName == firstName затем Ording по Дата. Затем я был жестким, чтобы использовать случай, когда lastName был в firstName, и были выполнены другие соответствия.

Нет, если это сработало и теперь я потерян.

Есть ли относительно простой способ удаления дубликатов, сопоставляемых с столбцами personID, Name и DOB, сохраняющими самые последние уникальные случаи?

Большое спасибо заранее.

+1

См http://stackoverflow.com/questions/5963269/how-to-make-a -great-r-воспроизводимый пример о том, как сделать воспроизводимый пример из ваших данных. Убедитесь, что люди могут просто скопировать-вставить код для восстановления этого фрейма данных. –

+0

Oops @Joris Meys, исправлено с dput(). – John

+1

Есть две очень разные проблемы. Трудно определить, когда имена двух человек одинаковы: у вас могут быть орфографические ошибки, сокращения и произвольные заказы первого/последнего/среднего имени. Простой принимает последнее значение для каждого человека: после того, как столбец personID был исправлен, просто отсортируйте данные по столбцу даты, а последние значения: 'data [! Duplicated (data $ personID, fromLast = TRUE) ,]. –

ответ

1

Я использовал @ Винсент

data[ !duplicated(data$personID, fromLast=TRUE), ]

после того, как упорядоченные по:

data <- ddply(.data=data, .variables= 'date')

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