删除组中顺序错误的行

时间:2018-07-26 08:06:33

标签: r

我有一个大约1000个组的数据,每个组的顺序是1-100(可以是100内的任何数字)。 当我浏览数据时。我发现有些小组的订单不好,即订购100个,然后突然出现24个。 如何删除所有这些错误数据

enter image description here

从上图中(在->之前)可以看到,我想找到所有未遵循组中顺序的行并将其删除。

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:2)

假设每次我们可以使用orderave列增加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