Завершение фрейма данных в группах с использованием комбинаций вне группы - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно добавить отсутствующие комбинации переменных в группы, но используя комбинации извне этой группы.Возьмите следующий пример.Вот фрейм данных, где оценщики смотрят на образцы, а затем отвечают на три вопроса о выборке.Рэйтер А посмотрел образцы 1, 2 и 3, тогда как Рэйтер Б рассмотрел только образцы 1 и 2. Обратите внимание, что Рэйтер Б только выполнил пункт 7060 и 7930 для образца 1, но не завершил пункт 7842. Я хочу обратитьсяэтот неявный выигрыш предмета в явное пропаданиеЦель состоит в том, чтобы добавить строки для элементов, которые отсутствуют в образце, но не добавить образцы, которые отсутствуют в оценщиках (т. Е. Не добавлять образец 3 в оценщик B, но добавить недостающие элементы в образцы, которые были оценены оценщиком B).).

library(tidyverse)

df <- data_frame(
  rater_id = c(rep("A", 9), rep("B", 5)),
  sample_id = c(rep(1, 3), rep(2, 3), rep(3, 3), rep(1, 2), rep(2, 3)),
  item_id = c(7060, 7842, 7930, 9571, 4678, 5966, 1758, 3148, 2574,
              7060, 7930, 9571, 4678, 5966),
  score = sample(c(0, 1), size = 14, replace = TRUE)
)
df
#> # A tibble: 14 x 4
#>    rater_id sample_id item_id score
#>    <chr>        <dbl>   <dbl> <dbl>
#>  1 A                1    7060     0
#>  2 A                1    7842     0
#>  3 A                1    7930     1
#>  4 A                2    9571     0
#>  5 A                2    4678     0
#>  6 A                2    5966     1
#>  7 A                3    1758     0
#>  8 A                3    3148     1
#>  9 A                3    2574     0
#> 10 B                1    7060     0
#> 11 B                1    7930     0
#> 12 B                2    9571     0
#> 13 B                2    4678     1
#> 14 B                2    5966     1

Я пытался использовать tidy::complete без особого успеха.Вложение с помощью sample_id и item_id не добавляет отсутствующую строку, поскольку все комбинации sample_id и item_id уже присутствуют в данных.

df %>% complete(nesting(sample_id, item_id))
#> # A tibble: 14 x 4
#>    sample_id item_id rater_id score
#>        <dbl>   <dbl> <chr>    <dbl>
#>  1         1    7060 A            0
#>  2         1    7060 B            0
#>  3         1    7842 A            0
#>  4         1    7930 A            1
#>  5         1    7930 B            0
#>  6         2    4678 A            0
#>  7         2    4678 B            1
#>  8         2    5966 A            1
#>  9         2    5966 B            1
#> 10         2    9571 A            0
#> 11         2    9571 B            0
#> 12         3    1758 A            0
#> 13         3    2574 A            0
#> 14         3    3148 A            1

Добавление rater_id внеоператор вложенности также не может дать желаемый результат.Он успешно добавляет отсутствующую строку для образца 1, но также добавляет дополнительные отсутствующие строки для образца 3. Однако, поскольку Rater B никогда не давал образец 3, мы не будем считать это «отсутствующим» (даже если технически это так).

df %>% complete(rater_id, nesting(sample_id, item_id))
#> # A tibble: 18 x 4
#>    rater_id sample_id item_id score
#>    <chr>        <dbl>   <dbl> <dbl>
#>  1 A                1    7060     0
#>  2 A                1    7842     0
#>  3 A                1    7930     1
#>  4 A                2    4678     0
#>  5 A                2    5966     1
#>  6 A                2    9571     0
#>  7 A                3    1758     0
#>  8 A                3    2574     0
#>  9 A                3    3148     1
#> 10 B                1    7060     0
#> 11 B                1    7842    NA
#> 12 B                1    7930     0
#> 13 B                2    4678     1
#> 14 B                2    5966     1
#> 15 B                2    9571     0
#> 16 B                3    1758    NA
#> 17 B                3    2574    NA
#> 18 B                3    3148    NA

Мой идеальный вывод будет выглядеть так:

#> # A tibble: 18 x 4
#>    rater_id sample_id item_id score
#>    <chr>        <dbl>   <dbl> <dbl>
#>  1 A                1    7060     0
#>  2 A                1    7842     0
#>  3 A                1    7930     1
#>  4 A                2    4678     0
#>  5 A                2    5966     1
#>  6 A                2    9571     0
#>  7 A                3    1758     0
#>  8 A                3    2574     0
#>  9 A                3    3148     1
#> 10 B                1    7060     0
#> 11 B                1    7842    NA
#> 12 B                1    7930     0
#> 13 B                2    4678     1
#> 14 B                2    5966     1
#> 15 B                2    9571     0

1 Ответ

0 голосов
/ 27 ноября 2018

Это немного уродливо, но вы можете использовать свою последнюю попытку (добавив rater_id вне оператора вложенности), а затем удалить случаи, когда пары rater-sample вообще не существуют.Возможно несколько способов сделать это, но этот, кажется, работает:

df %>% 
  complete(rater_id, nesting(sample_id, item_id)) %>% # This was your approach
  group_by(rater_id, sample_id) %>% 
  mutate(count_non_nas = sum(!is.na(score))) %>% # Count up the number of non-NA scores
  filter(count_non_nas > 0) %>% # Remove cases where ALL the scores in a group are NA
  select(-count_non_nas) %>% # Drop the intermediate column
  ungroup()

df

# A tibble: 15 x 4
   rater_id sample_id item_id score
   <chr>        <dbl>   <dbl> <dbl>
 1 A                1    7060     1
 2 A                1    7842     0
 3 A                1    7930     0
 4 A                2    4678     0
 5 A                2    5966     0
 6 A                2    9571     0
 7 A                3    1758     0
 8 A                3    2574     0
 9 A                3    3148     0
10 B                1    7060     1
11 B                1    7842    NA
12 B                1    7930     1
13 B                2    4678     0
14 B                2    5966     1
15 B                2    9571     0
...