Фильтрация кадра данных по нескольким столбцам в R с минимум 6 соответствиями - PullRequest
1 голос
/ 08 февраля 2020

У меня есть следующие данные, и я хотел бы сохранить в наборе данных только те случаи, в которых есть ровно 6 экземпляров одного и того же человека (с одинаковыми фамилией и именем). Например, Quincy Acy появляется 6 раз в df, и я хотел бы сохранить каждый из этих случаев, но избавиться от Alex Abrines, потому что есть только 3 экземпляра (<6) этого человека. </p>

   last  first start_year end_year Team     GP   MIN   PTS     W     L
   <chr> <chr>      <int>    <int> <chr> <int> <dbl> <dbl> <int> <int>
 1 Abri… Alex        2016     2017 OKC      68  15.5   6      37    31
 2 Abri… Alex        2017     2018 OKC      75  15.1   4.8    42    33
 3 Abri… Alex        2018     2019 OKC      31  19     5.3    21    10
 4 Acy   Quin…       2013     2014 SAC      63  13.5   2.7    22    41
 5 Acy   Quin…       2014     2015 NYK      68  18.9   5.9    12    56
 6 Acy   Quin…       2015     2016 SAC      59  14.8   5.3    21    38
 7 Acy   Quin…       2016     2017 BKN      38  14.7   5.8    11    27
 8 Acy   Quin…       2017     2018 BKN      70  19.4   5.9    26    44
 9 Acy   Quin…       2018     2019 PHX      10  12.3   1.7     2     8

Я пробовал x <- df %>% count(last, first) %>% filter(n == 6), за которым следует df %>% filter(last %in% x$last & first %in% x$first), но это соответствует любой фамилии и любому имени отдельно, а не совпадает с фамилией и именем. Я уверен, что есть также более простое решение с фильтром без необходимости использовать group_by.

Я бы хотел, чтобы решение выглядело следующим образом:

  <chr> <chr>      <int>    <int> <chr> <int> <dbl> <dbl> <int> <int>
1 Acy   Quin…       2013     2014 SAC      63  13.5   2.7    22    41
2 Acy   Quin…       2014     2015 NYK      68  18.9   5.9    12    56
3 Acy   Quin…       2015     2016 SAC      59  14.8   5.3    21    38
4 Acy   Quin…       2016     2017 BKN      38  14.7   5.8    11    27
5 Acy   Quin…       2017     2018 BKN      70  19.4   5.9    26    44
6 Acy   Quin…       2018     2019 PHX      10  12.3   1.7     2     8
7 Adams Stev…       2013     2014 OKC      81  14.8   3.3    59    22
8 Adams Stev…       2014     2015 OKC      70  25.3   7.7    37    33
9 Adams Stev…       2015     2016 OKC      80  25.2   8      54    26
10 Adams Stev…       2016     2017 OKC      80  29.9  11.3    47    33
11 Adams Stev…       2017     2018 OKC      76  32.7  13.9    43    33
12 Adams Stev…       2018     2019 OKC      80  33.4  13.8    47    33

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Вместо count с summarise данными, созданием нового объекта и затем filter, мы можем group_by, 'last', 'first' и непосредственно filter на основе групп при условии

library(dplyr)
df1 <- df %>%
         group_by(last, first) %>%
         filter(n() == 6)

Если оно равно как минимум 6, измените значение == или >=


. Или другой вариант: table

* 1016. *
0 голосов
/ 08 февраля 2020

В базе R мы можем использовать ave для подсчета количества строк в каждой группе значений first и last и выбора групп, в которых количество строк равно 6.

subset(df, ave(start_year, first, last, FUN = length) == 6)

#  last first start_year end_year Team GP  MIN PTS  W  L
#4  Acy Quin…       2013     2014  SAC 63 13.5 2.7 22 41
#5  Acy Quin…       2014     2015  NYK 68 18.9 5.9 12 56
#6  Acy Quin…       2015     2016  SAC 59 14.8 5.3 21 38
#7  Acy Quin…       2016     2017  BKN 38 14.7 5.8 11 27
#8  Acy Quin…       2017     2018  BKN 70 19.4 5.9 26 44
#9  Acy Quin…       2018     2019  PHX 10 12.3 1.7  2  8

Мы можно сделать то же самое с data.table

library(data.table)
setDT(df)[,.SD[.N == 6], .(first, last)]

data

df <- structure(list(last = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), .Label = c("Abri…", "Acy"), class = "factor"), first = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Alex", "Quin…"
), class = "factor"), start_year = c(2016L, 2017L, 2018L, 2013L, 
2014L, 2015L, 2016L, 2017L, 2018L), end_year = c(2017L, 2018L, 
2019L, 2014L, 2015L, 2016L, 2017L, 2018L, 2019L), Team = structure(c(3L, 
3L, 3L, 5L, 2L, 5L, 1L, 1L, 4L), .Label = c("BKN", "NYK", "OKC", 
"PHX", "SAC"), class = "factor"), GP = c(68L, 75L, 31L, 63L, 
68L, 59L, 38L, 70L, 10L), MIN = c(15.5, 15.1, 19, 13.5, 18.9, 
14.8, 14.7, 19.4, 12.3), PTS = c(6, 4.8, 5.3, 2.7, 5.9, 5.3, 
5.8, 5.9, 1.7), W = c(37L, 42L, 21L, 22L, 12L, 21L, 11L, 26L, 
2L), L = c(31L, 33L, 10L, 41L, 56L, 38L, 27L, 44L, 8L)), class = "data.frame", 
row.names = c(NA, -9L))
...