r - 如何有条件地选择每组中的一行/行?

标签 r data.table

样本数据:

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

我无法使用 data.table 通过 grp 有条件地对行进行子集化。比如我希望等价于下面的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 中的 group 变量是长度为 1 的向量(与其他变量不同),因此可以避免使用效率低于 ifelse如果/否则:

tmp_dt[, length(grp), grp]

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

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

相关文章:

r - 基于 R 中字符串比较的相似度得分(编辑距离)

在 R 的 data.table 中删除 NA

r - data.table,如何重置cumsum(或添加一个组来分组)

r - 计算总和矩阵

R STAN - 如何制定多元协方差矩阵

在 R 中重新排列数据框中的信息

R 组合列表项

r - 每列采样一行,大量缺失数据

r - 为什么 as.Date 在字符向量上速度很慢?

r - 使用 ggplot2 网格显示不良