2015-04-22 84 views
0

我有一个具有重复值的数据帧。它看起来像这样删除R中的数据帧中的重复值

5 Bernadette Mendez F 581916 13 72 68 73 75 84 72 68 77 65 71 70 
6 Bobbie Stanley M 347045 13 87 89 86 89 88 87 95 87 89 88 NA 
7 Casey Gonzalez M 732776 13 78 89 99 95 89 85 94 94 98 97 95 
8 Cheryl Silva  F 382579 15 91 91 86 99 89 90 96 88 95 40 NA 
9 Cheryl Silva  F 382579 15 91 91 86 99 89 90 96 88 95 88 90 
10 Crystal Armstrong F 815414 16 86 84 86 76 81 87 85 91 81 81 NA 
11 Doris Russell F 861836 14 89 96 97 78 94 97 86 92 90 99 90 

我想删除基于第五列重复的行,并保持一个排出来它有最后一个字段为“NA”的复制品。

我能够通过使用重复的方法删除重复的行。但是我无法提出保留哪一行的条件。

回答

1

如果你不想使用duplicated

df[!duplicated(df[, 2:3]), ] # keep first Cheryl 
df[!duplicated(df[, 2:3], fromLast = TRUE), ] # keep last Cheryl 

你可能分裂,应用和重新组合如像:

tmp <- split(df, apply(df[, 2:3], 1, paste, collapse = " ")) # split data frame on names 
idx <- sapply(tmp, nrow) > 1 # identify duplicates 
tmp[idx] <- lapply(tmp[idx], function(df) df[is.na(df[, ncol(df)]), ]) # keep those with NA in last col 
do.call(rbind, tmp) # bind split data frames together again 

看起来不太好,但给你更多的灵活性。

1

分类最后一栏把NA值最后:

df1 <- df1[order(df1[,ncol(df1)], na.last = TRUE), ] 

没有重复第5列(去年):

df1[!duplicated(df1[,5], fromLast = TRUE), ]