选择r中多个组中的个人

时间:2018-09-29 22:16:25

标签: r string select grouping which

我(非常)是R的新手,正在尝试选择多个组中的单个用户。我有两个字符串变量- 因此,请考虑以下示例数据

user <- c("User1", "User2", "User1", "User3","User4", 
          "User5", "User3", "User6", "User7", "User8", "User5")
place <- c("PlaceA", "PlaceA", "PlaceB", "PlaceB", "PlaceC", 
           "PlaceC", "PlaceC", "PlaceC", "PlaceD", "PlaceD", "PlaceD")
users_df <- data.frame(user, place)

我需要一些东西来查找哪些用户出现在多个特定的组中,例如:

  • PlaceA中有哪些用户,PlaceB中也有哪些用户,或
  • 哪些用户位于PlaceBPlaceCPlaceD中,或者
  • 哪些用户位于[{PlaceB AND(PlaceCPlaceD)]中?

理想情况下,我想将相关行集中到一个单独的数据框中,因此对于第一个示例,新数据框看起来像-

User1   PlaceA
User1   PlaceB

但是与这里的数据相比,实际数据具有大约25,000个观察值,更多变量以及大约5,000个可以在多达43个组/地点出现的人的唯一姓名。

我尝试了unique%in%whichstr_which的不同用法,但是我完全迷失了...任何想法?

2 个答案:

答案 0 :(得分:1)

library(dplyr)
users_df %>% group_by(user) %>% filter(n() > 1)

这将为您提供所需的内容-请注意,您正在按user进行分组,并获取所有实例不止一个的所有实例。

让我一步一步地带您进入最终输出(这对我也有所说明。)现在,正如您的评论中所述,如果您不关心在单个组中多次出现的用户,则只需更改到

users_df %>% 
  group_by(user) %>%
  filter(n() > 1) %>% 
  group_by(user, place) %>% 
  filter(n() == 1)

例如,如果您对条件有更具体的说明,例如A和B中的用户:

## Use the `filter(n() == 1)` as necessary
users_df %>% 
  group_by(user) %>%
  dplyr::filter(place %in% c("PlaceA", "PlaceB")) %>%
  filter(n() > 1) 

您最近的评论中的案例:(A和B)| (C&D&E)。这似乎很棘手,但是我们可以借助lapply发挥创造力。

lapply(
  list(
    paste0("Place", c("A", "B")),
    paste0("Place", c("C", "D", "E"))
  ), function(x)
    users_df %>%
    group_by(user) %>%
    filter(place %in% c(x)) %>%
    filter(n() == length(x) & n() > 1)
) %>% 
  bind_rows()

上述代码的组合可以为您提供所需的信息。

答案 1 :(得分:1)

最好像这样创建数据(相同的结果,但是在全局环境中最终不会得到随机命名的矢量):

 users_df <- data.frame(
 user = c("User1", "User2", "User1", "User3","User4", "User5", "User3", "User6", "User7", "User8", "User5"),
 place  = c("PlaceA", "PlaceA", "PlaceB", "PlaceB", "PlaceC", "PlaceC", "PlaceC", "PlaceC", "PlaceD", "PlaceD", "PlaceD"))

然后使用基本函数split,该函数具有用于数据帧的方法:

group_by_user <- split(users_df, users_df$user)
group_by_user  #output not included

 sapply( group_by_user, function(df) length( unique(df$place) ) )
User1 User2 User3 User4 User5 User6 User7 User8 
    2     1     2     1     2     1     1     1 

如果需要place使用的计数:

> grouped_data <- split(users_df, users_df$place)
> grouped_data
$PlaceA
   user  place
1 User1 PlaceA
2 User2 PlaceA

$PlaceB
   user  place
3 User1 PlaceB
4 User3 PlaceB

$PlaceC
   user  place
5 User4 PlaceC
6 User5 PlaceC
7 User3 PlaceC
8 User6 PlaceC

$PlaceD
    user  place
9  User7 PlaceD
10 User8 PlaceD
11 User5 PlaceD

然后您可以通过place名称进行选择,如下所示:

> grouped_data[['PlaceB']]
   user  place
3 User1 PlaceB
4 User3 PlaceB

或者您可以像这样遍历数据帧列表:

lapply( grouped_data, nrow)
$PlaceA
[1] 2

$PlaceB
[1] 2

$PlaceC
[1] 4

$PlaceD
[1] 3


> sapply( grouped_data, nrow)
PlaceA PlaceB PlaceC PlaceD 
     2      2      4      3