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

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

Контекст: У меня есть набор данных с большим количеством строк (+ 150K) с 32 соответствующими столбцами. Второй столбец - это номер документа. Номер документа не является уникальным идентификатором. Таким образом, дата содержит строки с несколькими строками с одинаковым номером документа. Мне нравится создавать список номеров документов. Этот список номеров документов содержит другой список с соответствующими строками с такими же номерами документов.

Например: Вот пример данных (я включил вывод dput из примера ниже).

Document Number  Col.A          Col.B
A                random_56681   random_24984
A                random_78738   random_23098
A                random_48640   random_32375
B                random_96243   random_96927
B                random_72045   random_52583
C                random_19367   random_20441
C                random_96778   random_22161
C                random_48038   random_95644
C                random_62999   random_44561

Теперь вот что я ищу. Мне нужен список, который содержит 3 документа (A, B, C). Каждый из этих списков должен содержать другой список, содержащий соответствующие строки. Например, основной список (скажем, my_list) должен иметь 3 списка A, B и C; каждый из списков должен содержать соответственно 3, 2 и 4 списка.

Надеюсь, я достаточно ясно задал вопрос (если нет, пожалуйста, дайте мне знать).

Здесь вы можете найти пример данных:

structure(list(Document_Number = structure(c(1L, 1L, 1L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    Col.A = structure(c(4L, 7L, 3L, 8L, 6L, 1L, 9L, 2L, 5L), .Label = c("random_19367", 
    "random_48038", "random_48640", "random_56681", "random_62999", 
    "random_72045", "random_78738", "random_96243", "random_96778"
    ), class = "factor"), Col.B = structure(c(4L, 3L, 5L, 9L, 
    7L, 1L, 2L, 8L, 6L), .Label = c("random_20441", "random_22161", 
    "random_23098", "random_24984", "random_32375", "random_44561", 
    "random_52583", "random_95644", "random_96927"), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

Вы можете использовать split, например:

split(x, x$Document_Number)
#$A
#  Document_Number        Col.A        Col.B
#1               A random_56681 random_24984
#2               A random_78738 random_23098
#3               A random_48640 random_32375
#
#$B
#  Document_Number        Col.A        Col.B
#4               B random_96243 random_96927
#5               B random_72045 random_52583
#
#$C
#  Document_Number        Col.A        Col.B
#6               C random_19367 random_20441
#7               C random_96778 random_22161
#8               C random_48038 random_95644
#9               C random_62999 random_44561
2 голосов
/ 04 мая 2020

Опция group_split

library(dplyr)
df1 %>%
    group_split(Document_Number)
...