保持行仅对应于列中的某些值
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 个唯一值相对应的行。 qwe
的 pg
的前 3 个唯一值是 1,5 和 2,所以我们保留从 1 到 6 的行。对于 setosa
,pg
的前 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
我有一个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
.
编辑:(我想要的详细解释)
我想要的是为每个 Species
保留与 pg
的前 rem_imp
个唯一值相对应的行。例如,对于 qwe
,我想保留与 pg
的前 3 个唯一值相对应的行。 qwe
的 pg
的前 3 个唯一值是 1,5 和 2,所以我们保留从 1 到 6 的行。对于 setosa
,pg
的前 2 个唯一值是 11和 25,所以我们将 setosa
.
输出如下所示
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