我有一个大约1000个组的数据,每个组的顺序是1-100(可以是100内的任何数字)。 当我浏览数据时。我发现有些小组的订单不好,即订购100个,然后突然出现24个。 如何删除所有这些错误数据
从上图中(在->之前)可以看到,我想找到所有未遵循组中顺序的行并将其删除。
任何帮助都会很棒!
答案 0 :(得分:2)
假设每次我们可以使用order
时ave
列增加1,那么我们将与group
的前一行相差1的行删除。
df[!ave(df$order, df$group, FUN = function(x) c(1, diff(x))) != 1, ]
# group order
#1 1 1
#2 1 2
#3 1 3
#4 1 4
#6 2 1
#7 2 2
#8 2 3
#9 2 4
编辑
对于更新后的示例,我们只需更改比较
df[ave(df$order, df$group, FUN = function(x) c(1, diff(x))) >= 0, ]
答案 1 :(得分:2)
lag
将计算当前值与先前值之间的差,diff
将仅用于选择正差,即当前值大于先前值。 min用作滞后给出第一个值NA
。我保留助手列diff
进行检查,但是您可以使用%>% select(-diff)
library(dplyr)
df1 %>% group_by(gruop) %>% mutate(diff = order-lag(order)) %>%
filter(diff >= 0 | order==min(order))
# A tibble: 8 x 3
# Groups: gruop [2]
gruop order diff
<int> <int> <int>
1 1 1 NA
2 1 3 2
3 1 5 2
4 1 10 5
5 2 1 NA
6 2 4 3
7 2 4 0
8 2 8 4
df1 <- read.table(text="
gruop order
1 1
1 3
1 5
1 10
1 2
2 1
2 4
2 4
2 8
2 3
",header=T, stringsAsFactors = F)
答案 2 :(得分:1)
玩data.table
:
library(data.table)
setDT(df1)[, diffo := c(1, diff(order)), group][diffo == 1, .(group, order)]
group order
1: 1 1
2: 1 2
3: 1 3
4: 1 4
5: 2 1
6: 2 2
7: 2 3
8: 2 4
df1
在哪里:
df1 <- data.frame(
group = rep(1:2, each = 5),
order = c(1:4, 2, 1:4, 3)
)
编辑
如果您只需要递增顺序,而无需步长为1,则可以执行以下操作:
df3 <- transform(df1, order = c(1,3,5,10,2,1,4,7,9,3))
setDT(df3)[, diffo := c(1, diff(order)), group][diffo >= 1, .(group, order)]
group order
1: 1 1
2: 1 3
3: 1 5
4: 1 10
5: 2 1
6: 2 4
7: 2 7
8: 2 9