我(非常)是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
中也有哪些用户,或PlaceB
和PlaceC
和PlaceD
中,或者PlaceB
AND(PlaceC
或PlaceD
)]中?理想情况下,我想将相关行集中到一个单独的数据框中,因此对于第一个示例,新数据框看起来像-
User1 PlaceA
User1 PlaceB
但是与这里的数据相比,实际数据具有大约25,000个观察值,更多变量以及大约5,000个可以在多达43个组/地点出现的人的唯一姓名。
我尝试了unique
,%in%
,which
和str_which
的不同用法,但是我完全迷失了...任何想法?
答案 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