R中有聚合的热处理子集?
我有一个20万行的大数据框,有两列:组id和用户id。一个用户可以属于多个组。我需要一个结果数据框,其中包含属于3个以上组的所有用户的组id、用户idR中有聚合的热处理子集?,r,subset,R,Subset,我有一个20万行的大数据框,有两列:组id和用户id。一个用户可以属于多个组。我需要一个结果数据框,其中包含属于3个以上组的所有用户的组id、用户id group_id user_id 100 1 101 1 102 1 103 1 101 2 103 2 在上面的示例中,在结果数据帧中,我将只获得前4行 df <- structure(list(group_id = c(100L, 101L, 102L, 103
group_id user_id
100 1
101 1
102 1
103 1
101 2
103 2
在上面的示例中,在结果数据帧中,我将只获得前4行
df <- structure(list(group_id = c(100L, 101L, 102L, 103L, 101L, 103L
), user_id = c(1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("group_id",
"user_id"), class = "data.frame", row.names = c(NA, -6L))
data.table包使这变得简单。如果df是原始数据帧,则可以
library(data.table)
setDT(df)[, .SD[.N > 3], by = user_id]
# user_id group_id
# 1: 1 100
# 2: 1 101
# 3: 1 102
# 4: 1 103
.N告诉我们每个组中有多少行被选为用户id,.SD选择所有列。因此,SD[.N>3]为我们提供了所有超过三行的组
注意:如果不想将原始df更改为数据表,可以使用as.data.table代替setDT。但是,这将生成df的副本。data.table包使这变得简单。如果df是原始数据帧,则可以
library(data.table)
setDT(df)[, .SD[.N > 3], by = user_id]
# user_id group_id
# 1: 1 100
# 2: 1 101
# 3: 1 102
# 4: 1 103
.N告诉我们每个组中有多少行被选为用户id,.SD选择所有列。因此,SD[.N>3]为我们提供了所有超过三行的组
注意:如果不想将原始df更改为数据表,可以使用as.data.table代替setDT。然而,这将复制df。这里有一个dplyr解决方案,但在看到@Richard's时,我知道还有一个更好的dplyr方法:
使用@Richard的评论:
df %>%
group_by(user_id) %>%
filter(n() > 3)
这里有一个dplyr解决方案,但看到@Richard's我知道还有一个更好的dplyr方法:
使用@Richard的评论:
df %>%
group_by(user_id) %>%
filter(n() > 3)
假设每个“用户id”的“组id”都是唯一的,那么使用base R的选项将是
假设每个“用户id”的“组id”都是唯一的,那么使用base R的选项将是
我认为一种更简单的dplyr方法是组bydf,用户id%>%slicen>3@RichardScriven perfect@Richard我认为切片不起作用,但过滤器确实看到了我的编辑。是我的错。那应该是过滤器。我以为slice现在也在这么做,但我错了,我认为更简单的dplyr方法应该是group_bydf,user_id%>%slice>3@RichardScriven perfect@Richard我认为切片不起作用,但过滤器确实看到了我的编辑。是我的错。那应该是过滤器。我以为slice现在也在这么做,但我错了