R中常见的删除重复值的方法,不论是:
data1 <- data %>%
group_by_(ID) %>%
filter(row_number() == 1) %>%
ungroup()
还是:
index <- duplicated(data$ID)
data1 <- data[!index]
还是:
data1 <- unique(data$ID)
都不能避免一个问题:保留重复数据的第一行。具体表现,以‘duplicated’函数结果为例:
ID | time | value | index |
---|---|---|---|
1 | 1 | 10 | FALSE |
2 | 1 | 15 | FALSE |
2 | 2 | 76 | TRUE |
这样当我们构建排除了重复值的数据库data1时,实际上是把第二行数据包括进去的。而当我们需要把第二行和第三行这样的数据都删除的时候,上述代码目前没有发现可行的方案。因此用for 循环自己写一个。
代码如下:
mark1 <- 1
markvec <- c(1:length(data$ID))
mark2 <- c('SAME')
for (mark1 in markvec) {
if (data$ID[mark1] == data$ID[mark1+1]) {
mark2 <- c(mark2, 'SAME')
}else{if (data$ID[mark1] == data$ID[mark1-1]) {
mark2 <- c(mark2, 'SAME')
}else{mark2 <- c(mark2, '来啦老弟!?')}
}
mark1 <- mark1 + 1
}
table(mark2)
View(tail(data, 10))
mark2 <- c(mark2[2:12138], 'SAME')
data$index <- mark2
data1 <- filter(data, data$index == '来啦老弟!?')
这样把其中mark2标识为“来啦老弟!?”的记录存入data1, data1即是彻底删除重复值的数据库。
其中的
mark2 <- c('SAME')
# 和
mark2 <- c(mark2[2:12138], 'SAME')
需要人工观察data的前、后几行来进行判断到底是不是重复值,判断方法即:
View(head(data, 10))
View(tail(data, 10))