条件超过不同行的子集数据

时间:2017-05-09 18:44:28

标签: r subset

我试图根据不同行中的条件对数据进行子集化。 换句话说,我希望对访问商店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_idA

数据

B

2 个答案:

答案 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