【问题标题】:Return most frequent string value for each group [duplicate]返回每个组的最频繁字符串值[重复]
【发布时间】:2015-07-07 11:13:22
【问题描述】:
a <- c(rep(1:2,3))
b <- c("A","A","B","B","B","B")
df <- data.frame(a,b)

> str(b)
chr [1:6] "A" "A" "B" "B" "B" "B"

  a b
1 1 A
2 2 A
3 1 B
4 2 B
5 1 B
6 2 B

我想按变量a分组,返回b最频繁的值

我想要的结果是这样的

  a b
1 1 B
2 2 B

dplyr 中会是这样的

df %>% group_by(a) %>% summarize (b = most.frequent(b))

我提到dplyr 只是为了形象化问题。

【问题讨论】:

  • 好的,我自己找到了df %&gt;% group_by(a) %&gt;% summarize (b =names(which.max(table(b))))
  • 你是如何得到计数的。

标签: r summarization


【解决方案1】:

by()a 的每个值,创建btable() 并提取该table() 中最大条目的names()

> with(df,by(b,a,function(xx)names(which.max(table(xx)))))
a: 1
[1] "B"
------------------------
a: 2
[1] "B"

您可以将其包装在 as.table() 中以获得更漂亮的输出,尽管它仍然与您想要的结果不完全匹配:

> as.table(with(df,by(b,a,function(xx)names(which.max(table(xx))))))
a
1 2 
B B

【讨论】:

    【解决方案2】:

    关键是按ab 开始分组以计算频率,然后只取a 的每组最频繁的,例如这样:

    df %>% 
      count(a, b) %>%
      slice(which.max(n))
    
    Source: local data frame [2 x 3]
    Groups: a
    
      a b n
    1 1 B 2
    2 2 B 2
    

    当然还有其他方法,所以这只是一个可能的“关键”。

    【讨论】:

    • 嗨,我试过这个解决方案。不是真的工作。该函数将只返回最大 n 行,而不是每组的最大行。在这种情况下,有一个平局——所以你可以看到 2 行(n 都是 2,如果组 A==1 最大 b==B n 是 3 和组 A==2,最大 b==B 是 2那么你将只有一行)
    • 我认为@talat 可能忘记了一行代码。将 count 的输出通过管道传输到 group_by 中,然后再将它们传输到 slice
    【解决方案3】:

    对我有用或更简单的是:

    df %>% group_by(a) %>% count(b) %>% top_n(1) # includes ties
    
    library(data.table)
    DT<-as.data.table(df)
    DT[ , .N, by=.(a, b)][
      order(-N), 
      .SD[ N == max(N) ]
      ,by=a]                     # includes ties
    

    【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2015-12-30
    • 2018-02-17
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多