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