保持行仅对应于列中的某些值

keep rows corresponding to only some values in a column

我有一个data.table喜欢关注

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp
 1:          5.1         3.5          1.4         0.2     qwe  1       3
 2:          4.9         3.0          1.4         0.2     qwe  1       3
 3:          4.7         3.2          1.3         0.2     qwe  5       3
 4:          4.6         3.1          1.5         0.2     qwe  2       3
 5:          5.0         3.6          1.4         0.2     qwe  2       3
 6:          5.4         3.9          1.7         0.4     qwe  2       3
 7:          4.6         3.4          1.4         0.3     qwe  3       3
 8:          5.0         3.4          1.5         0.2     qwe  3       3
 9:          4.4         2.9          1.4         0.2     qwe  3       3
10:          4.9         3.1          1.5         0.1     qwe  3       3
11:          5.4         3.7          1.5         0.2  setosa 11       2
12:          4.8         3.4          1.6         0.2  setosa 11       2
13:          4.8         3.0          1.4         0.1  setosa 15       2
14:          4.3         3.0          1.1         0.1  setosa 15       2
15:          5.8         4.0          1.2         0.2  setosa 13       2

structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8), Sepal.Width = c(3.5, 3, 
3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4), Petal.Length = c(1.4, 
1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 
1.2), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 
0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2), Species = c("qwe", "qwe", 
"qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "setosa", 
"setosa", "setosa", "setosa", "setosa"), pg = c(1, 1, 5, 2, 2, 
2, 3, 3, 3, 3, 11, 11, 15, 15, 13), rem_imp = c(3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 2, 2, 2, 2, 2)), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species", "pg", "rem_imp"), row.names = c(NA, 
-15L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000011eb0788>)

对于第 Species 列的每个值,我只想保留与第 pg 列的前 rem_imp 个值相对应的那些行。例如,对于 qwe,我只想保留列 pg 的前 3 个(rem_imp 列值)值。对于 setosa,我只想保留 pg.

列的前 2 个值

编辑:(我想要的详细解释)

我想要的是为每个 Species 保留与 pg 的前 rem_imp 个唯一值相对应的行。例如,对于 qwe,我想保留与 pg 的前 3 个唯一值相对应的行。 qwepg 的前 3 个唯一值是 1,5 和 2,所以我们保留从 1 到 6 的行。对于 setosapg 的前 2 个唯一值是 11和 25,所以我们将 setosa.

的行从 11 到 14 保留

输出如下所示

     Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp
 1:          5.1         3.5          1.4         0.2     qwe  1       3
 2:          4.9         3.0          1.4         0.2     qwe  1       3
 3:          4.7         3.2          1.3         0.2     qwe  5       3
 4:          4.6         3.1          1.5         0.2     qwe  2       3
 5:          5.0         3.6          1.4         0.2     qwe  2       3
 6:          5.4         3.9          1.7         0.4     qwe  2       3
 7:          5.4         3.7          1.5         0.2  setosa 11       2
 8:          4.8         3.4          1.6         0.2  setosa 11       2
 9:          4.8         3.0          1.4         0.1  setosa 15       2
10:          4.3         3.0          1.1         0.1  setosa 15       2

我相信这可以在一条语句中完成,但我到现在还不能成功。 我正在寻找 data.table 语法解决方案(基本上是单行解决方案)。我不想 运行 循环什么的。我该怎么做?

这里有一个选项:

dt[dt[, cumsum(!duplicated(pg)) <= rem_imp[1L], by = Species]$V1]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp
# 1:          5.1         3.5          1.4         0.2     qwe  1       3
# 2:          4.9         3.0          1.4         0.2     qwe  1       3
# 3:          4.7         3.2          1.3         0.2     qwe  5       3
# 4:          4.6         3.1          1.5         0.2     qwe  2       3
# 5:          5.0         3.6          1.4         0.2     qwe  2       3
# 6:          5.4         3.9          1.7         0.4     qwe  2       3
# 7:          5.4         3.7          1.5         0.2  setosa 11       2
# 8:          4.8         3.4          1.6         0.2  setosa 11       2
# 9:          4.8         3.0          1.4         0.1  setosa 15       2
#10:          4.3         3.0          1.1         0.1  setosa 15       2