我有一个这样的数据框:
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
与不重复的行。
答案 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)),]