我有一个包含以下字段的大型数据框(示例数据)。
#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,Name和DOB上匹配的重复项,以便返回的值包含每个唯一案例具有最新日期的大多数条目。
也就是说,我想返回第5,7,8,10和11行。
我分隔了名字和姓氏,因为我设想通过最初提取lastName == firstName
然后按日期排序的案例来起作用。然后我强硬起来,我可以使用lastName在firstName中的情况,并满足其他的意见。
没有,如果这有效,现在我迷路了。
是否有一种相对简单的方法可以删除匹配列personID,Name和DOB的重复项,保留最新的唯一案例?
非常感谢提前。
答案 0 :(得分:1)
我用过@Vincent的
data[ !duplicated( data$personID, fromLast=TRUE ), ]
经过排序后:
data <- ddply(.data=data, .variables= 'date')