Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中有聚合的热处理子集?_R_Subset - Fatal编程技术网

R中有聚合的热处理子集?

R中有聚合的热处理子集?,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

我有一个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, 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现在也在这么做,但我错了