样本数据:
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/