столбец данных, содержащий списки, извлеченные как столбцы одного и того же кадра данных - PullRequest
0 голосов
/ 18 мая 2018

У меня есть датафрейм с 3 столбцами.Один из столбцов (второй) содержит список значений на ячейку.Здесь dput пример данных:

   df <- structure(list(column1 = c("HEATER", "COOLER"), column2 = list(structure(list(
        insidelist = structure(list(es = list("1"), en = list("00"), la = list(
            "01")), .Names = c("es", "en", "la"))), .Names = "insidelist"), 
        structure(list(insidelist = structure(list(es = list("1"), en = list(
            "01"), la = list("01")), .Names = c("es", "en", "la"))), .Names = "insidelist")), 
        column3 = c("88", "31")), .Names = c("column1", "column2", "column3"
    ), row.names = c(NA, -2L), class = "data.frame")

Предоставление этой df:

  column1   column2     column3
1  HEATER   1, 00, 01      88
2  COOLER   1, 01, 01      31

Как получить этот список значений из второго столбца в виде столбцов исходного кадра данных?

Желаемый выход:

  column1   column2 Column3 column4 column5
1  HEATER     1       00       01      88
2  COOLER     1       01       01      31

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Мы можем сделать

library(tidyverse)
df %>% 
  mutate(out = map(column2, ~ .x %>%
                              transpose %>%
                              unlist %>%
                              as.list %>% 
                              as_tibble)) %>% 
         unnest %>% 
         select(-column2)
0 голосов
/ 19 мая 2018

Не поймите меня неправильно, я люблю аккуратный способ делать вещи так же, как все здесь, и многие люди изучают R программирование, идя по более легкому пути благодаря этому, но я иногда думаю , когда у вас естьУ молотка все выглядит как гвоздь .

У Tidyverse есть много достоинств, но есть и недостатки, один из которых, кажется, маскирует / скрывает основы языка R. В этом случае самое мощное и «читаемое человеком» решение (imho) - это смешивание подходов в удобочитаемом виде.

Давайте посмотрим.Сначала мы избавляемся от вложенных списков, преобразуя их во фрейм данных:

df$column2 <- data.frame(matrix(unlist(df$column2), nrow=nrow(df), byrow=T))

> df
  column1 column2.X1 column2.X2 column2.X3 column3
1  HEATER          1         00         01      88
2  COOLER          1         01         01      31

Затем извлекаем внутренний фрейм данных (колонка2) и помещаем его рядом с оригинальным df:

df <- cbind(select(df,-column2), df$column2)

Выбор / переименование столбцов является тривиальной задачей.Вот пример после привязки:

df <- cbind(df, df$column2) %>%
      select(Column1=1, Column2=4, Column3=5, Column4=6, Column5=3)

Это дает нам желаемый результат:

> df

  Column1 Column2 Column3 Column4 Column5
1  HEATER       1    00      01      88
2  COOLER       1    01      01      31

Погружение в аккуратный код иногда заканчивается не таким уж чистым решением.Я знаю, что многие люди изучают R таким образом, но мудрым программистам следует опасаться темных мест, к которым это может привести, если вы спешите к переходу на другую сторону для каждой проблемы, не учитывающей базу R.

0 голосов
/ 18 мая 2018

Вот мой путь - не такой лаконичный, как akrun и AntoniosK, но, возможно, немного более читабельный:

df %>% 
  unnest(column2) %>% 
  mutate(lengths = map_int(column2, ~ length(unlist(.x))),
         column2 = map_chr(column2, ~ glue::collapse(unlist(.x), sep = ',') )) %>% 
  separate(column2, sep = ',', into = paste('temp', seq(1,max(.$lengths)), sep = '_')) %>%
  select(column1, starts_with('temp'), column3) %>%
  setNames(paste0("column", 1:ncol(.)))

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

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