【问题标题】:In a data.table remove identical consecutive values over certain times by group在 data.table 中,按组在特定时间删除相同的连续值
【发布时间】:2019-11-15 00:24:42
【问题描述】:

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

【问题讨论】:

  • 这样的? dt[, .SD[.N == 1], by = rleid(Species, Petal.Width)]
  • @RonakShah 如果我在 j 的 rleid 中也使用 Species 可以吗?
  • @RonakShah 非常接近。我也想在结果中包含SpeciesPetal.Width
  • @chinsoon12 当然可以。 @Suren 我是这么认为的,因此没有将其作为答案。 :)

标签: r data.table


【解决方案1】:

这是一个选项:

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

【讨论】:

  • 我想知道要勾选哪个...这个似乎更快,但@Cole 的似乎更直观。
  • @Cole 的回答非常优雅! dt[, .SD[.N &lt; 3], by = .(Petal.Width, Species)]
【解决方案2】:

这是一个选项:

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 建议将rleid() 包裹在Pedal.Width 周围以过滤掉连续值。

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2022-01-12
    • 2018-10-06
    • 2016-10-06
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多