У меня есть большой фрейм данных со следующими полями (пример данных).удалить дубликаты, сопоставленные по 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, сохраняющими самые последние уникальные случаи?
Большое спасибо заранее.
См http://stackoverflow.com/questions/5963269/how-to-make-a -great-r-воспроизводимый пример о том, как сделать воспроизводимый пример из ваших данных. Убедитесь, что люди могут просто скопировать-вставить код для восстановления этого фрейма данных. –
Oops @Joris Meys, исправлено с dput(). – John
Есть две очень разные проблемы. Трудно определить, когда имена двух человек одинаковы: у вас могут быть орфографические ошибки, сокращения и произвольные заказы первого/последнего/среднего имени. Простой принимает последнее значение для каждого человека: после того, как столбец personID был исправлен, просто отсортируйте данные по столбцу даты, а последние значения: 'data [! Duplicated (data $ personID, fromLast = TRUE) ,]. –