Выровняйте фрейм данных, объедините значения столбца в списки, чтобы заполнить отдельные ячейки - PullRequest
2 голосов
/ 04 апреля 2020

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

Color      Value
Red            1
Red            3
Red            4
Red            7
Blue           2
Blue           5
Green          1
Green          2
Green          3

То, что я хотел бы сделать, это объединить значения в список, который я могу поместить в отдельную ячейку, развернутую по цвету. То есть мне нужна таблица, которая выглядит следующим образом:

  Color        Value
  Red      [1,3,4,7]
  Blue         [2,5]
  Green      [1,2,3]

У меня есть некоторый успех в решении этой проблемы с помощью для l oop, но я обнаружил, что для его выполнения требуется значительное время. Есть ли в тидиверсе более оперативная функция обработки данных, которая может выполнить это преобразование? Я думал, что пакет purrr может содержать ответ, но мне трудно ориентироваться.

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2020
library('data.table')
setDT(df)[, .(Value = paste0("[", paste0( Value, collapse = ","), "]")), by = .(Color)]
#    Color     Value
# 1:   Red [1,3,4,7]
# 2:  Blue     [2,5]
# 3: Green   [1,2,3]

Данные:

df <- read.table(text='Color      Value
Red            1
                 Red            3
                 Red            4
                 Red            7
                 Blue           2
                 Blue           5
                 Green          1
                 Green          2
                 Green          3', header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 04 апреля 2020

Мы можем использовать aggregate

aggregate(Value ~ Color, df1, FUN = toString)

Если нам нужно list

aggregate(Value ~ Color, df1, FUN = list)

Или с dplyr

library(dplyr)
df1 %>%
   group_by(Color) %>%
   summarise(Value = toString(Value))

Или как list

df1 %>%
   group_by(Color) %>%
   summarise(Value = list(Value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...