group_by,获取最频繁和次频繁的内容

4

我有以下数据集:

a   b

1   a           
1   a           
1   a           
1   none            
2   none            
2   none            
2   b           
3   a           
3   c           
3   c
3   d
4   a

我希望在任何a的情况下获取b中最常见的值和第二常见的值。如果b中有两个值具有相同的频率,那么我对于哪个值被认为是“第一”或“第二”是无所谓的。
在这种情况下,期望的输出应该是:
d2:
a    first    second 
1    a        none
2    none     b
3    c        a(or d, doesn't matter)
4    a        NA

如您所见,a=4 在 b 中只有一个值,因此我希望输出列"second"中出现 NA,因为没有第二个最常见的值。

数据:

a <- c(1,1,1,1,2,2,2,3,3,3,3,4)
b<- c("a","a", "a", "none", "none", "none", "b", "a", "c" , "c",  "d","a")  
d <-  data.frame(a,b)

目前我尝试的是以下内容

d1 <-  d %>% group_by(a) %>% summarize ( first =names(which.max(table(b)))  , second= names(which.max(table(b)[-which.max(table(b))] )))

但它无法正常工作,有什么建议吗?

2个回答

8
你可以计算出 a 和 b 的组合中的行数,对于每个 a 的值,在 summarize 中选择第1个和第2个值。
library(dplyr)
 d %>%
  count(a, b, sort = TRUE) %>%
  group_by(a) %>%
  summarise(first = b[1],second = b[2])


# A tibble: 4 x 3
#      a first second
#  <dbl> <chr> <chr> 
#1     1 a     none  
#2     2 none  b     
#3     3 c     a     
#4     4 a     NA    

1
太棒了,谢谢!我也尝试使用“count”,但只是在“b”上,并且在使用group_by(a)之后,我根本没有考虑使用sort! - Carbo

1
这是一个使用 data.table 的选项。
library(data.table)
setDT(d)[, .N, .(a, b)][order(N), .(first = first(b), second = b[2]), a]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接