R 分组依据,其中包含与最常见因子关联的每个分组元素

R group by with each grouped element associated with most common factor

提问人:at. 提问时间:5/2/2023 最后编辑:thelatemailat. 更新时间:5/2/2023 访问量:63

问:

我想按列分组,并为每个唯一因素选择最常见的因数。例如:aba

tibble(a = c(1,1,1,2,2,2), b = factor(c('cat', 'dog', 'cat', 'cat', 'dog', 'dog'))) %>%
    reframe(b = most_common(b), .by = a)

我希望它产生:

一个 b
1
2

但是,该函数不存在。是否有有效的 R 函数用于此目的?这一定是数据清理的一个非常普遍的需求(我需要它)。我搜索并找到了实现功能的人。我可以使用其中之一,但它们似乎效率低下。有没有更好的方法来解决这个整体问题?most_commonmode

dplyr group-by 数据清理 r 因子

评论

0赞 I_O 5/2/2023
实际上,R有一个功能(尽管有其他目的)。以下是使用 R 查找模式(最常见的值)的一些建议:stackoverflow.com/questions/2547402/...mode
0赞 thelatemail 5/2/2023
“它们似乎效率低下”——如此处所述的折叠包中的函数呢 - stackoverflow.com/a/60765505/496803 - 在这个主题的问题中?如果这在某种程度上效率不高,我会感到震惊,因为处理全部被推送到编译的代码中,并且它有一个特定的方法来分组的琐碎。fmoder-faq

答:

-1赞 ThomasIsCoding 5/2/2023 #1

我们可以使用table + max.col

d <- table(df)
data.frame(
  a = as.numeric(row.names(d)),
  b = colnames(d)[max.col(d)]
)

这给了

  a   b
1 1 cat
2 2 dog

或如下所述使用dplyr

  group_by(a) %>%
  summarise(b = names(which.max(table(b))))

这给了

# A tibble: 2 × 2
      a b
  <dbl> <chr>
1     1 cat
2     2 dog

评论

0赞 at. 5/2/2023
我喜欢您的第二个解决方案,但已弃用。显然,应该改用。summarisereframe
0赞 thelatemail 5/2/2023
@at。- 不,没有被弃用。不推荐使用它返回 0 或 >1 行。查看 dplyr.tidyverse.org/reference/summarise.htmlsummarisereframe