我有一个数据框,请参阅下文。如何在某些条件下压缩/删除行?我想选择最高音量,只有在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
答案 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