如何压缩/删除R中条件的行?

时间:2017-05-24 10:03:50

标签: r data.table vectorization

我有一个数据框,请参阅下文。如何在某些条件下压缩/删除行?我想选择最高音量,只有在V1

连续1的情况下

例如:V1的{​​{1}}全部等于df[2:5,],其中最高音量为1,因此删除df[4,],{{1}最高音量为df[c(2,3,5),],删除df[9:10,] .....等......结果将类似于示例图片其中{{} 1}}将像0101010101 ....

如何在不使用循环的情况下实现这一目标,如何实现矢量化方式,以便计算速度更快(处理数百万行时)?

更新 我使用df[10,]应用相同的循环但仅在Volume较小时删除,这就是为什么第13行在示例图片中被删除的原因因为第13行的音量小于第14行的音量。

更新(另一个问题): 我尝试过akrun的方法,我从组中选择最大df[9,],但如果最多有两个或更多,那么仍然会有一个连续的V1,如下所示V2。如何删除重复的行? 我可以使用Volume,还有另外一种方法吗?感谢

更新 跟进akrun的尝试,代码将删除1之后不是我之后的行,我想仅在row 9时删除并且音量较小比该组的最大音量。我知道在duplicated(df$Volume)中会有一些连续的0,删除V1==0中的重复0将取决于V1==1,这就是我需要删除{{1}的原因仅限,无法删除V1

V1

数据框df

Weight

示例图片

V1==1

3 个答案:

答案 0 :(得分:3)

您可以使用library(data.table)

setDT(df)[, .SD[(Volume == max(Volume) & V1 == 1) | V1 != 0], by = rleid(df$V1)][]

编辑:

关于列丢弃问题,来自akrun的改编技巧:

setDT(df)[df[, .I[(Volume == max(Volume) & V1 == 1) | V1 == 0], rleid(V1)]$V1][]

答案 1 :(得分:2)

我们可以使用rle

中的base R
grp <- inverse.rle(within.list(rle(df$V1), values <- seq_along(values)))
df[with(df, ave(Volume, grp, FUN = max)==Volume),]
#   Volume Weight V1 V2
#1  0.5367 0.5367  0  1
#4  1.1457 1.1413  1  0
#6  0.5694 0.5633  0  1
#7  1.2368 1.2343  1  0
#8  0.9662 0.9593  0  1
#10 1.4102 1.3995  1  0
#11 1.1132 1.1069  0  1
#12 1.4535 1.3923  1  0
#14 1.1475 1.1447  0  1
#15 1.1790 1.1748  1  0
#18 1.1557 1.1552  0  1

注意:我们使用data.frame而非data.table作为输入数据

答案 2 :(得分:2)

或者,您可以尝试使用tidyverse函数。

dftest视为初始数据框,标记连续的组:

dftest$f1 <- ifelse(x <- dftest$V1 == 1, cumsum(c(head(x, 1), tail(x, -1) - head(x, -1) == 1)), NA)
dftest$f2 <- ifelse(x <- dftest$V2 == 1, cumsum(c(head(x, 1), tail(x, -1) - head(x, -1) == 1)), NA)

然后对这些群体进行操作:

dftest %>% 
  group_by(f1) %>%
  filter( if_else(is.na(f1), Volume == Volume, Volume == max(Volume))) %>%
  ungroup() %>%
  group_by(f2) %>%
  filter( if_else(is.na(f2), Volume == Volume, Volume == max(Volume)))

给出:

Source: local data frame [11 x 6]
Groups: f2 [7]

   Volume Weight    V1    V2    f1    f2
    <dbl>  <dbl> <int> <int> <int> <int>
1  0.5367 0.5367     0     1    NA     1
2  1.1457 1.1413     1     0     1    NA
3  0.5694 0.5633     0     1    NA     2
4  1.2368 1.2343     1     0     2    NA
5  0.9662 0.9593     0     1    NA     3
6  1.4102 1.3995     1     0     3    NA
7  1.1132 1.1069     0     1    NA     4
8  1.4535 1.3923     1     0     4    NA
9  1.1475 1.1447     0     1    NA     5
10 1.1790 1.1748     1     0     5    NA
11 1.1557 1.1552     0     1    NA     6