如何在 R 的 data.table 中使用切片 [duplicate]

How to use slice in data.table in R [duplicate]

提问人:Victor Hartman 提问时间:1/8/2023 更新时间:1/8/2023 访问量:104

问:

我有一个包含 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")]
r dplyr group-by data.table 切片

评论


答:

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
这仅因为 中的值与其排名相对应而有效。它应该是 .hv101which.min