我试图根据不同行中的条件对数据进行子集化。
换句话说,我希望对访问商店customers
并存储A
的{{1}}进行分组。
以下是一个例子:
B
我想获得dfrm <- data.frame(cust_id=sample(c(1:3),5,replace = TRUE),
store=sample(LETTERS[1:2],5,replace = TRUE))
> dfrm
cust_id store
>> 3 B
>> 3 A
>> 1 B
>> 1 B
>> 2 B
= 3的子集,因为他访问了cust_id
和A
。
数据
B
答案 0 :(得分:1)
为了完整起见,这里还有两个data.table
解决方案:
第一个返回访问正好两个不同商店的所有客户的dfrm
的所有行:
library(data.table)
setDT(dfrm)[, .SD[uniqueN(store) == 2L], by = cust_id]
# cust_id store
#1: 3 B
#2: 3 A
这也是dplyr
solution的作用,但对于80 k行的数据集,速度提高了约25%。
第二个返回访问不同商店的最大数量的所有客户的dfrm
的所有行(这是在给定的玩具数据样本中也是2):
setDT(dfrm)[, .SD[uniqueN(store) == uniqueN(dfrm[["store"]])], by = cust_id]
# cust_id store
#1: 3 B
#2: 3 A
这也是base R solution所做的,但对于80 k行的数据集来说快了大约15倍。
答案 1 :(得分:0)
使用dplyr
包,
你可以这样做:
dfrm %>% group_by(cust_id) %>% filter(n_distinct(store,na.rm=T)==2)
返回访问两个不同商店的客户:
cust_id store
<dbl> <fctr>
1 3 B
2 3 A