использование Отдельные_строки в тидыре для многих столбцов, когда некоторые столбцы не имеют разделителей - PullRequest
0 голосов
/ 02 июля 2019

У меня есть следующий фиктивный набор данных:

A <- c("Acura", "BMW", "Toyota", NA)
B <- c("1993;2004;2010", "2013", "2003;2011", NA)
C <- c("Blue;Black;Gold", "Silver", NA, NA)

df <- data.frame(A = A, B = B, C = C)

Итак, фрейм данных выглядит следующим образом:

> df
         A                B                 C
  1  Acura   1993;2004;2010   Blue;Black;Gold
  2    BMW             2013            Silver
  3 Toyota        2003;2011              <NA>
  4   <NA>             <NA>              <NA>

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

> new_df
          A         B          C
  1   Acura      1993       Blue
  2   Acura      2004      Black
  3   Acura      2010       Gold
  4     BMW      2013     Silver
  5  Toyota      2003       <NA>
  6  Toyota      2011       <NA>
  7    <NA>      <NA>       <NA>

Я попытался использовать tidyr :: separa_rows, однако я получаю эту ошибку, потому что отдельным строкам требуется одинаковое количество разделителей в каждом столбце за строкой. Это означает, что строка 3 (A = Toyota) является проблемой, поскольку в столбце C для этой строки есть NA, а не что-то вроде «NA; NA». Это команда и ошибка, которую я получаю:

df %>% separate_rows(B, C, sep = ";", convert = TRUE)
   Error: All nested columns must have the same number of elements.

df[c(1:2,4),] %>% separate_rows(B, C, sep = ";", convert = TRUE)
      A    B      C
1 Acura 1993   Blue
2 Acura 2004  Black
3 Acura 2010   Gold
4   BMW 2013 Silver
5  <NA>   NA   <NA>

df[c(3),] %>% separate_rows(B, C, sep = ";", convert = TRUE)
    Error: All nested columns must have the same number of elements.

Может кто-нибудь помочь как добиться new_df?!

1 Ответ

0 голосов
/ 02 июля 2019

Хорошо, самое простое решение - установить версию для разработчиков tidyr (0.8.3.9000), так как она, похоже, там исправлена.Для этого используйте devtools::install_github("tidyverse/tidyr").

Однако для обходного пути для тех, кто не может обновить или не хочет использовать предварительную версию пакета, мы можем подсчитать необходимое количество разделителей в каждомстрока и заполнить пропущенные значения в столбцах с разделителями.Это позволяет separate_rows работать и создавать пустые строки, которые мы затем заменяем обратно на NA.

library(tidyverse)
A <- c("Acura", "BMW", "Toyota", NA)
B <- c("1993;2004;2010", "2013", "2003;2011", NA)
C <- c("Blue;Black;Gold", "Silver", NA, NA)
df <- data.frame(A = A, B = B, C = C, stringsAsFactors = FALSE)

df %>%
  mutate(seps = str_pad("", width = str_count(B, ";"), pad = ";")) %>%
  mutate_at(vars(B, C), ~ coalesce(., seps)) %>%
  separate_rows(B, C, sep = ";") %>%
  mutate_at(vars(B, C), ~ str_replace(., "^$", NA_character_))
#>        A    B      C seps
#> 1  Acura 1993   Blue   ;;
#> 2  Acura 2004  Black   ;;
#> 3  Acura 2010   Gold   ;;
#> 4    BMW 2013 Silver     
#> 5 Toyota 2003   <NA>    ;
#> 6 Toyota 2011   <NA>    ;
#> 7   <NA> <NA>   <NA> <NA>

Создано в 2019-07-01 пакетом Представить (v0.3.0)

...