提问人:Victor Hartman 提问时间:1/8/2023 更新时间:1/8/2023 访问量:104
如何在 R 的 data.table 中使用切片 [duplicate]
How to use slice in data.table in R [duplicate]
问:
我有一个包含 200.000+ 行的大型数据集。我想按两列对其进行分组,根据另一列进行过滤,同时保留所有其他列。示例如下所示:
hv001 hv002 hv101 hv104 hv105
1 1 1 1 1 35
2 1 1 2 2 22
3 1 1 3 2 2
4 1 1 3 2 0
5 1 4 1 1 35
6 1 4 2 2 32
7 1 4 3 2 4
8 1 4 3 2 2
9 1 4 3 1 1
10 1 7 1 1 51
structure(list(hv001 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), hv002 = c(1,
1, 1, 1, 4, 4, 4, 4, 4, 7), hv101 = c(1, 2, 3, 3, 1, 2, 3, 3,
3, 1), hv104 = c(1, 2, 2, 2, 1, 2, 2, 2, 1, 1), hv105 = c(35,
22, 2, 0, 35, 32, 4, 2, 1, 51)), row.names = c(NA, -10L), class = "data.frame")
我可以用 dplyr 做到这一点,但它太慢了。代码如下所示:
df |>
group_by(hv001, hv002) |>
slice_min(hv101)
现在使用 data.table,可以更快地完成此操作,但是它不会保留所有列。如何保留所有列,或者在进行分组时如何对列进行切片?代码如下所示:
df_dt <- as.data.table(df)
df_dt[, .(min_hv101 = min(hv101)), by = c("hv001", "hv002")]
答:
0赞
Quinten
1/8/2023
#1
您可以像这样添加数据表的子集:.SD
library(data.table)
df_dt <- as.data.table(df)
df_dt[, .SD[(min_hv101 = min(hv101))], by = c("hv001", "hv002")]
#> hv001 hv002 hv101 hv104 hv105
#> 1: 1 1 1 1 35
#> 2: 1 4 1 1 35
#> 3: 1 7 1 1 51
创建于 2023-01-08 使用 reprex v2.0.2
这个答案很好地解释了 的含义:什么 .SD 代表 在 R 中的 data.table 中.SD
评论
2赞
Andre Wildberg
1/8/2023
这仅因为 中的值与其排名相对应而有效。它应该是 .hv101
which.min
评论