df 是这样的:
df <- data.frame(
groups=I(list(c("a"), c("b","c", "d", "e","f"), c("g","h"), c("i")))
)
df$group_count <- 0
people_codes
看起来像这样。 eid 是该人的 ID,present_code
是与该人关联的代码。
如果您愿意,您可以复制并粘贴:
people_codes<-data.frame(
eid=c(1,2,3,4,5,6, 7, 8, 9),
present_code=I(list(c("g", "h"), c("a"), c("i"), c("g", "h"), c("a"), c("i", "a"), c("h"), c("f"), c("e"))))
我想计算每个人身上至少出现
df$groups
中的一种元素的次数。
预期输出应该是:
groups group_count
"a" 3
"b","c", "d", "e","f" 2
"g","h" 3
"i" 2
基本上我正在计算每个类别的人数。并且您只需要至少匹配该组中的一个代码即可被视为计数。
使用嵌套循环可以完成这项工作:
for (row1 in 1:nrow(df)) {
for (row2 in 1:nrow(people_codes)){
if (any(people_codes[row2, "present_code"][[1]] %in% df[row1, "groups"][[1]])){
df[row1, "group_count"] <- df[row1, "group_count"]+1
}
}
}
然而,这是非常昂贵的,我正在寻找向量化它或使用分组策略。
也许你需要
unnest
+ left_join
df %>%
mutate(id = 1:n()) %>%
unnest(groups) %>%
left_join(
unnest(people_codes, present_code),
by = join_by(groups == present_code)
) %>%
summarise(groups = list(groups), count = n_distinct(eid, na.rm = TRUE), .by = id) %>%
select(-id)
这给出了
# A tibble: 4 × 2
groups count
<list> <int>
1 <chr [3]> 3
2 <chr [5]> 2
3 <chr [5]> 3
4 <chr [2]> 2