过滤data.frame中的前n个最大组

时间:2019-05-29 14:40:30

标签: r

对于示例数据:

set.seed(2222)
example_data <- data.frame(col1 = 1:15,
                           col2 = 16:30, 
                           group = sample(1:3, 15, replace = TRUE))

   col1 col2 group
1     1   16     2
2     2   17     1
3     3   18     3
4     4   19     2
5     5   20     3
6     6   21     1
7     7   22     3
8     8   23     1
9     9   24     3
10   10   25     1
11   11   26     2
12   12   27     2
13   13   28     2
14   14   29     3
15   15   30     3

我想找到记录数最多的前n个组。

比方说,我想获得记录数最多的前2个组。在数据中,这将是第3组和第2组:

example_data %>% 
  group_by(group) %>% 
  summarise(n = n())

# A tibble: 3 x 2
  group     n
  <int> <int>
1     1     4
2     2     5
3     3     6

预期输出为:

   col1 col2 group
1     1   16     2
2     3   18     3
3     4   19     2
4     5   20     3
5     7   22     3
6     9   24     3
7    11   26     2
8    12   27     2
9    13   28     2
10   14   29     3
11   15   30     3

5 个答案:

答案 0 :(得分:4)

我们可以使用table来计算每个group的频率,sortdecreasing的顺序,将前2个条目和filter分别分组。

library(dplyr)

example_data %>%
   filter(group %in% names(sort(table(group), decreasing = TRUE)[1:2]))


#   col1 col2 group
#1     1   16     2
#2     3   18     3
#3     4   19     2
#4     5   20     3
#5     7   22     3
#6     9   24     3
#7    11   26     2
#8    12   27     2
#9    13   28     2
#10   14   29     3
#11   15   30     3

您也可以直接在基本R subset

中使用它
subset(example_data, group %in% names(sort(table(group), decreasing = TRUE)[1:2]))

答案 1 :(得分:3)

我们可以使用tidyverse方法。创建一个频率列,其中add_countarrange,该列的filter和最后两个unique“ group”的值所在的行的行library(dplyr) example_data %>% add_count(group) %>% arrange(n) %>% filter(group %in% tail(unique(group), 2)) %>% select(-n) # A tibble: 11 x 3 # col1 col2 group # <int> <int> <int> # 1 1 16 2 # 2 4 19 2 # 3 11 26 2 # 4 12 27 2 # 5 13 28 2 # 6 3 18 3 # 7 5 20 3 # 8 7 22 3 # 9 9 24 3 #10 14 29 3 #11 15 30 3

data.table

或使用library(data.table) setDT(example_data)[group %in% example_data[, .N, group][order(-N), head(group, 2)]]

{{1}}

答案 2 :(得分:2)

使用$builder->add('list', CollectionType::class, [ 'required' => false, 'allow_add' => true, 'error_bubbling' => true, ]) ->add('price', IntegerType::class, [ 'required' => false, 'error_bubbling' => true, 'min' => 50 ]); ,您还可以执行以下操作:

dplyr

或者:

example_data %>%
 add_count(group) %>%
 filter(dense_rank(desc(n)) <= 2) %>%
 select(-n)

   col1  col2 group
   <int> <int> <int>
 1     1    16     2
 2     3    18     3
 3     4    19     2
 4     5    20     3
 5     7    22     3
 6     9    24     3
 7    11    26     2
 8    12    27     2
 9    13    28     2
10    14    29     3
11    15    30     3

答案 3 :(得分:1)

另一种dplyr方法可能是:

example_data %>% 
  group_by(group) %>% 
  count() %>% 
  ungroup() %>% 
  top_n(n = 2, wt = n) %>% 
  select(-n) %>% 
  inner_join(example_data)

答案 4 :(得分:0)

另一个解决方案(类似于@OTStats):

l1=Input(shape=(41,4))
x=Conv1D(64,(4))(l1)
x=GlobalMaxPooling1D()(x)
x=Dense(1)(x)
model=Model(l1,x)
model.compile('rmsprop','binary_crossentropy',metrics=['acc'])
model.fit(X,y,32,10)