Использование pivot_wider с более чем 100 переменными - PullRequest
1 голос
/ 27 января 2020

Нужна помощь по использованию pivot_wider. У меня есть большой набор данных с более чем 100 переменными и 300K наблюдений. Я пытаюсь распространить информацию еще дальше, основываясь на ключевой переменной, но, возможно, даже использую неправильный подход. Более краткий пример:

> example <- data.frame(incident_num = c("X1", "X1", "X2", "X3", "X3", "X3", "X4"),
                        unit_num     = c("T1", "E2", "M1", "M3", "T5", "E6", "M5"))
> example
  incident_num unit_num
1           X1       T1
2           X1       E2
3           X2       M1
4           X3       M3
5           X3       T5
6           X3       E6
7           X4       M5

Я пытаюсь найти следующее:

output
  incident_num unit_num_1 unit_num_2 unit_num_3
1           X1         T1         E2       <NA>
2           X2         M1       <NA>       <NA>
3           X3         M3         T5         E6
4           X4         M5       <NA>       <NA>

Сюда также входят все остальные переменные, связанные с unit_num. Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

3 голосов
/ 27 января 2020
library(tidyverse)

example %>% 
  group_by(incident_num) %>% 
  mutate(id = seq_along(incident_num)) %>% 
  pivot_wider(incident_num,
              names_from = id,
              values_from = unit_num,
              names_prefix = "unit_num_")

посмотрите на результат, я правильно понял?

df <- data.frame(incident_num = c("X1", "X1", "X2", "X3", "X3", "X3", "X4"),
                 unit_num1     = c("T1", "E2", "M1", "M3", "T5", "E6", "M5"), 
                 unit_num2     = c("A1", "B2", "C1", "C3", "J5", "U6", "B5"))

df %>% 
  group_by(incident_num) %>% 
  mutate(id = row_number()) %>% 
  pivot_wider(incident_num,
              names_from = id,
              values_from = vars_select(names(df), starts_with("unit_num")))

Пожалуйста, покажите результат для вашего примера. Вы ожидаете этого?

df %>% 
  group_by(incident_number) %>%
  mutate(id = row_number()) %>% 
  pivot_wider(incident_number, 
              names_from = id, 
              values_from = tidyselect::vars_select(names(df), -incident_number))
2 голосов
/ 27 января 2020

Мы можем создать столбец последовательности, сгруппированный по'ident_num ', а затем выполнить pivot_wider

library(dplyr)
library(tidyr)
library(stringr)
example %>% 
    group_by(incident_num) %>%
    mutate(rn = str_c('unit_num_', row_number())) %>%
    ungroup %>%
    pivot_wider(names_from = rn, values_from = unit_num)
# A tibble: 4 x 4
#  incident_num unit_num_1 unit_num_2 unit_num_3
#  <fct>        <fct>      <fct>      <fct>     
#1 X1           T1         E2         <NA>      
#2 X2           M1         <NA>       <NA>      
#3 X3           M3         T5         E6        
#4 X4           M5         <NA>       <NA>      
...