Сглаживание фрейма данных с вложенными списками, содержащими значения NULL в R - PullRequest
1 голос
/ 08 мая 2020

Я хотел бы сжать этот фрейм данных, который является результатом чтения файла JSON, чтобы удалить значения NULL. В настоящее время при отмене вложенности фрейма данных я получаю ненужные значения NA. Я пробовал compact в мурлыкании, и я пробовал некоторые операции is.null, но безрезультатно.

Вывод данных после чтения файла json выглядит примерно так:

    col1        col2       col3
1   c(a,b,c)    NULL       NULL
2   NULL        c(d,e,f)   NULL
3   NULL        NULL       c(g,h,i)

И я хочу он должен выглядеть так:

    col1        col2       col3
1   c(a,b,c)    c(d,e,f)   c(g,h,i)

Так что, когда я отключаю фрейм данных, я получаю:

    col1   col2   col3
1   a      d      g
2   b      e      h
3   c      f      i

Я знаю, что для этого должна быть правильная функция, но я все еще не знаю ' не нашел! Приносим извинения за любые ошибки форматирования в этом посте, все еще в новинку!

1 Ответ

1 голос
/ 08 мая 2020

Если я правильно понимаю ваш вопрос, ваши данные выглядят так:

tibble(col1 = list(c("a", "b", "c"), NULL, NULL), 
       col2 = list(NULL, c("d", "e", "f"), NULL),
       col3 = list(NULL, NULL, c("g", "h", "i"))) 

# A tibble: 3 x 3
  col1      col2      col3     
  <list>    <list>    <list>   
1 <chr [3]> <NULL>    <NULL>   
2 <NULL>    <chr [3]> <NULL>   
3 <NULL>    <NULL>    <chr [3]>

То есть что-то вроде фрейма данных или тиббла со столбцами списка, где некоторые из ячеек содержат некоторый (символьный) вектор и другие - NULL, и вы хотите уменьшить это до одной строки только с вектором и оставить пустые значения.

Мое решение - использовать dplyr::summarise и purrr::compact, чтобы уменьшить строки до одного row и, чтобы избавиться от этих надоедливых NULL s соответственно:

tibble(col1 = list(c("a", "b", "c"), NULL, NULL), 
       col2 = list(NULL, c("d", "e", "f"), NULL),
       col3 = list(NULL, NULL, c("g", "h", "i"))) %>% 
    summarise_all(compact) 

# A tibble: 1 x 3
  col1      col2      col3     
  <list>    <list>    <list>   
1 <chr [3]> <chr [3]> <chr [3]>

Отключение этого даст вам

# A tibble: 3 x 3
  col1  col2  col3 
  <chr> <chr> <chr>
1 a     d     g    
2 b     e     h    
3 c     f     i    

Примечание: это работает только до тех пор, пока у вас есть один не -null в каждом столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...