如何在R中使用数据表中的切片[duplicate]

3phpmpom  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(115)
    • 此问题在此处已有答案**:

(9个答案)
昨天关门了。
我有一个包含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,可以更快地完成这一操作,但是它并不保留所有列。如何保留所有列,或者在执行group by时如何对列进行切片?代码如下所示:

df_dt <- as.data.table(df)
  df_dt[, .(min_hv101 = min(hv101)), by = c("hv001", "hv002")]
ru9i0ody

ru9i0ody1#

您可以像这样添加.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年1月8日,reprex v2.0.2
这个答案很好地解释了.SD的含义:What does .SD stand for in data.table in R

相关问题