在data.table中,如果某个列的值在一定次数内连续发生,则我希望删除相应的行。我也想分组做这件事。
例如,假设dt是我的data.table。如果同一值在按Petal.Width分组的Species中连续发生2次以上,我希望删除行。
dt <- iris[c(1:3, 7:7, 51:53, 62:63), ]
setDT(dt)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 7 4.6 3.4 1.4 0.3 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 52 6.4 3.2 4.5 1.5 versicolor
# 53 6.9 3.1 4.9 1.5 versicolor
# 62 5.9 3.0 4.2 1.5 versicolor
# 63 6.0 2.2 4.0 1.0 versicolor期望的结果是具有以下行的data.table。
# 7 4.6 3.4 1.4 0.3 setosa
# 51 7.0 3.2 4.7 1.4 versicolor
# 63 6.0 2.2 4.0 1.0 versicolor发布于 2019-11-15 00:32:09
以下是一个选择:
library(data.table)
setDT(dt)[dt[,{
rl <- rleid(Species, Petal.Width)
rw <- rowid(rl)
.I[!rl %in% rl[rw > 1]]
}]]产出:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 4.6 3.4 1.4 0.3 setosa
2: 7.0 3.2 4.7 1.4 versicolor
3: 6.0 2.2 4.0 1.0 versicolor发布于 2019-11-15 00:33:04
这里有一个选择:
library(data.table)
dt <- iris[c(1:3, 7:7, 51:53, 62:63), ]
setDT(dt)
dt[dt[, .I[.N < 3], by = .(rleid(Petal.Width), Species)]$V1]感谢@chinsoon12 12建议将rleid()封装在Pedal.Width周围,以筛选出连续的值。
https://stackoverflow.com/questions/58868550
复制相似问题