使用NA值擦除重复项

时间:2016-04-28 18:48:08

标签: r duplicates slice

我有一个这样的数据框:

names <- c('Mike','Mike','Mike','John','John','John','David','David','David','David')
dates <- c('04-26','04-26','04-27','04-28','04-27','04-26','04-01','04-02','04-02','04-03')
values <- c(NA,1,2,4,5,6,1,2,NA,NA)
test <- data.frame(names,dates,values)

这是:

  names dates values
1  Mike 04-26     NA
2  Mike 04-26      1
3  Mike 04-27      2
4  John 04-28      4
5  John 04-27      5
6  John 04-26      6
7 David 04-01      1
8 David 04-02      2
9 David 04-02     NA
10 David 04-03    NA

我想摆脱NA值的重复项。因此,在这种情况下,我在04-26获得了迈克的有效观察,并且在04-02也得到了David的有效观察,因此第1行和第9行应该被删除,我将最终得到:

      names dates values
1  Mike 04-26      1
2  Mike 04-27      2
3  John 04-28      4
4  John 04-27      5
5  John 04-26      6
6 David 04-01      1
7 David 04-02      2
8 David 04-03      NA

我尝试使用duplicated函数,如下所示:

test[!duplicated(test[,c('names','dates')]),]

但由于某些NA值位于有效值之前,因此无效。如果不尝试merge或制作其他数据框,您有什么建议吗?

更新:我希望保留NA与不重复的行。

3 个答案:

答案 0 :(得分:3)

这是怎么回事?

display.__str__

答案 1 :(得分:1)

以下是data.table的尝试:

# set up
libary(data.table)
setDT(test)

# construct condition
test[, dupes := max(duplicated(.SD)), .SDcols=c("names", "dates"), by=c("names", "dates")]

# print out result
test[dupes == 0 | !is.na(values),]

这是一个使用基数R的类似方法,除了dupes变量与data.frame分开保存:

dupes <- duplicated(test[c("names", "dates")])
# this generates warnings, but works nonetheless
dupes <- ave(dupes, test$names, test$dates, FUN=max)
# print out result
test[dupes == 0 | !is.na(test$values),]

如果存在重复的行,其中values变量为NA,并且这些重复项不会对数据添加任何内容,则可以在运行上述代码之前删除它们:

testNoNADupes <- test[!(duplicated(test) & is.na(test$values)),]

答案 2 :(得分:0)

这应该基于您的样本。

test <- test[order(test$values),]
test <- test[!(duplicated(test$names) & duplicated(test$dates) & is.na(test$values)),]