在另一个列表中计算一个列表中的元素

问题描述 投票:0回答:1

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
    }
  }
}

然而,这是非常昂贵的,我正在寻找向量化它或使用分组策略。

r dataframe for-loop vectorization nested-loops
1个回答
0
投票

也许你需要

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
© www.soinside.com 2019 - 2024. All rights reserved.