样本数据:

tmp_dt <-
    data.table(grp = rep(c(1,2), each = 5), a = 1:10)

# > tmp_dt
#    grp  a
# 1:   1  1
# 2:   1  2
# 3:   1  3
# 4:   1  4
# 5:   1  5
# 6:   2  6
# 7:   2  7
# 8:   2  8
# 9:   2  9
# 10:  2 10

我知道我可以使用 .SD 为每个组获取行的子集:
tmp_dt[, .SD[c(2,3)], by = grp]
# grp a
# 1:   1 2
# 2:   1 3
# 3:   2 7
# 4:   2 8

我无法开始工作的是使用 grp 有条件地按 data.table 对行进行子集化。例如,我希望等效于以下 dplyr 代码:
tmp_dt %>%
    group_by(grp) %>%
    filter(if_else(grp == 1, row_number() == 3, row_number() == 2)) %>%
    ungroup

# A tibble: 2 × 2
#     grp     a
#     <dbl> <int>
# 1     1     3
# 2     2     7

最佳答案

data.table 中,您可以执行以下操作:

tmp_dt[tmp_dt[, .I[if(grp == 1) 3 else 2], grp]$V1]

#   grp a
#1:   1 3
#2:   2 7

请注意 data.table 中的组变量是长度为 1 的向量(与其他变量不同),因此您可以避免使用效率低于 if/else 的 ifelse:
tmp_dt[, length(grp), grp]

#   grp V1
#1:   1  1
#2:   2  1

关于r - 如何有条件地选择每组中的一行/几行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44771544/

10-12 18:58