R 如何有条件地选择每组中的行?

R 如何有条件地选择每组中的行?,r,data.table,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 我无法使用的是使用data.table按grp有条件地对行

样本数据:

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
我无法使用的是使用
data.table
grp
有条件地对行进行子集划分。例如,我希望等效于以下
dplyr
code:

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
tmp\u dt%>%
分组依据(grp)%>%
过滤器(如果其他(grp==1,行数()==3,行数()==2))%>%
解组
#一个tibble:2×2
#玻璃钢
#      
# 1     1     3
# 2     2     7

数据表中,您可以执行以下操作:

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

#   grp a
#1:   1 3
#2:   2 7
请注意
数据中的组变量。表
是一个长度为1的向量(与其他变量不同),因此您可以避免使用效率低于if/else的
ifelse


以您的例子来说,
if-else
方法可能是一条可行之路

如果您想对其进行扩展,可以使用“查找”
data.table
来告诉您要使用哪一行

grp_dt <- data.table(grp = c(1,2),
                     row = c(3,2))

tmp_dt[ grp_dt, on = "grp", a[i.row], by = .EACHI]
# tmp_dt[ grp_dt, on = "grp", .(a = a[i.row]), by = .EACHI] ## to keep column name

#    grp V1
# 1:   1  3
# 2:   2  7
grp\u dt
tmp_dt[, length(grp), grp]

#   grp V1
#1:   1  1
#2:   2  1
grp_dt <- data.table(grp = c(1,2),
                     row = c(3,2))

tmp_dt[ grp_dt, on = "grp", a[i.row], by = .EACHI]
# tmp_dt[ grp_dt, on = "grp", .(a = a[i.row]), by = .EACHI] ## to keep column name

#    grp V1
# 1:   1  3
# 2:   2  7