Разделение списка на фрейм данных R - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь разбить этот список на длинный фрейм данных

list_a <- list(`Blue Banana` = 8.7, `Green Strawberry` = 2.3, 
               `Blue Squash` = 3.5, `Orange Cherry` = 4.5)

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

Color  Fruit      value
Blue   Banana       8.7
Green  Strawberry   2.3
Blue   Squash       3.5
Orange Cherry       4.5

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы можете сделать это с read.table() в базе R.

cbind(
    read.table(text=names(list_a), col.names=c("Color", "Fruit")), 
    value=unlist(list_a, use.names=FALSE)
)
#    Color      Fruit value
# 1   Blue     Banana   8.7
# 2  Green Strawberry   2.3
# 3   Blue     Squash   3.5
# 4 Orange     Cherry   4.5

Или с strcapture().

cbind(
    strcapture("(.+) (.+)", names(list_a), data.frame(Color="", Fruit="")), 
    value=unlist(list_a, use.names=FALSE)
)

Или простым вызовом tidyr::separate() с помощьюstack().

tidyr::separate(stack(list_a), ind, c("Color", "Fruit"))
#   values  Color      Fruit
# 1    8.7   Blue     Banana
# 2    2.3  Green Strawberry
# 3    3.5   Blue     Squash
# 4    4.5 Orange     Cherry
0 голосов
/ 14 февраля 2019

Вы можете попробовать:

library(tidyverse)

list_a %>% 
  bind_rows %>%
  gather %>%
  separate(col = key, sep = " ", c("Color", "Fruit"))

# A tibble: 4 x 3
  Color  Fruit      value
  <chr>  <chr>      <dbl>
1 Blue   Banana       8.7
2 Green  Strawberry   2.3
3 Blue   Squash       3.5
4 Orange Cherry       4.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...