Как вы можете собрать () несколько столбцов одновременно в dplyr (R)? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь собрать неопрятные данные от широкого до длинного формата.У меня есть 748 переменных, которые нужно сжать примерно до 30.

В этой записи я спросил: как привести в порядок мои широкие данные?Ответ: используйте collect ().

Однако я все еще пытаюсь собрать несколько столбцов и надеялся, что вы сможете точно определить, где я ошибаюсь.

Воспроизводимый пример:

tb1 <- tribble(~x1,~x2,~x3,~y1,~y2,~y3,
       1,NA,NA,NA,1,NA,
       NA,1,NA,NA,NA,1,
       NA,NA,1,NA,NA,1)

# A tibble: 3 x 6
#     x1    x2    x3 y1       y2    y3
#  <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
#1     1    NA    NA NA        1    NA
#2    NA     1    NA NA       NA     1
#3    NA    NA     1 NA       NA     1

с x1-y3, имеющим следующие характеристики:

1 x1    Green 
2 x2    Yellow
3 x3    Orange
4 y1    Yes   
5 y2    No    
6 y3    Maybe 

Я пробовал это:

tb1 %>%
  rename("Green" =x1,
         "Yellow"=x2,
         "Orange"=x3,
         "Yes"=y1,
         "No"=y2,
         "Maybe"=y3) %>%
  gather(X,val,-Green,-Yellow,-Orange) %>%
  gather(Y,val,-X) %>%
  select(-val)

Iполучил вывод, который я хотел для этих переменных, но я не представляю, как это сделать для 700+ переменных ?!Есть ли более эффективный способ?

tb1 %>%
  rename("Green" =x1,
         "Yellow"=x2,
         "Orange"=x3,
         "Yes"=y1,
         "No"=y2,
         "Maybe"=y3) %>%
  gather(X,val,-Green,-Yellow,-Orange) %>%
  filter(!is.na(val)) %>%
  select(-val) %>%
  gather(Y,val,-X) %>%
  filter(!is.na(val)) %>%
  select(-val)

# A tibble: 3 x 2
  X     Y     
  <chr> <chr> 
1 No    Green 
2 Maybe Yellow
3 Maybe Orange

Я думаю, что я, возможно, просто недостаточно знаком с collect (), так что это, вероятно, глупый вопрос - буду признателен за помощь.Спасибо!

1 Ответ

1 голос
/ 07 мая 2019

Я предполагаю, что проблема здесь в том, чтобы вручную указать все разные имена переменных. К счастью, tidyverse имеет ?select_helpers, что облегчает выбор столбцов на основе различных правил.

Вместо переименования переменных в начале, мы можем переименовать их в конце. Это позволяет нам использовать starts_with, чтобы получить все столбцы, начинающиеся с x или y, и собрать их вместе за один шаг. Затем мы можем использовать ends_with, чтобы выбрать столбцы значений из этих шагов сбора, отфильтровать и удалить их.

Наконец, мы заменяем все значения x1, y1 и т. Д. Их истинными значениями за один шаг, используя mutate_all и справочную таблицу

# Make lookup table to match X and Y variables with Values
  # the initial values should be the `names` (first) and the values to change them to
  # should be the `values` (after the =)
lookup <- c('x1' = 'Green',
            'x2' = 'Yellow',
            'x3' = 'Orange',
            'y1' = 'Yes',
            'y2' = 'No',
            'y3' = 'Maybe')

tb1 %>%
    gather(X, Xval, starts_with('x')) %>%    # Gather all variables that start with ‘x'
    gather(Y, Yval, starts_with('y')) %>%    # Gather all variables that start with ‘y'
    filter_at(vars(ends_with('val')),        # Looking in columns ending with ‘val'
              all_vars(!is.na(.))) %>% %>%    # Drop rows if ANY of these cols are NA
    select(-ends_with('val')) %>%            # Drop columns ending in ‘val'
    mutate_all(~lookup[.])                   # Replace value from lookup table in all cols

# A tibble: 3 x 2
  X      Y 
  <chr>  <chr>
1 Green  No   
2 Yellow Maybe
3 Orange Maybe

Одна из хитростей, связанных с select_helpers, - это знать, когда вы используете их в одиночку и когда вам нужно «зарегистрировать» их с помощью vars. В gather и select вы можете использовать их как есть. В mutate, filter, summarize и т. Д. Вам необходимо окружить их vars

...