как быстро развернуть фрейм данных, используя списки внутри фрейма данных - PullRequest
1 голос
/ 29 апреля 2019

У меня есть фрейм данных, который содержит один столбец с уникальным строковым идентификатором, другой столбец с простой строкой / ключевым словом и третий столбец, представляющий собой строку, разделенную запятыми («категориями»).Этот фрейм данных имеет x строк, а строка категорий в 3-м столбце может содержать любое количество запятых.Я хочу разделить категории запятыми, добавить строку ключевого слова к каждой из этих разделенных категорий, а затем создать новый фрейм данных, который состоит из столбца для уникального идентификатора строки и столбца для каждой новой созданной строки.

Вот пример моего начального DF:

startDF <- data.frame(uq_id = c("44ffd", "t3dd", "rrk33--ds", "limmt3"),
                      keyword = c("citizen", "river", "mouse", "hello"),
                      categories = c("App, Restaurant, Hotel", "Field, Place", "Movie", "App, Hotel, Theater, Show"))

А вот как я хотел бы, чтобы последний DF выглядел так:

endDF <- data.frame(uq_iq = c("44ffd", "44ffd", "44ffd", "t3dd", "t3dd", "rrk33--ds", "limmt3", "limmt3", "limmt3", "limmt3"),
                    combo = c("citizen App", "citizen Restaurant", "citizen Hotel", "river Field", "river Place", "mouse Movie",
                              "hello App", "hello Hotel", "hello Theater", "hello Show"))

В настоящее время я перебираю каждыйэлемент DF и создание этого нового информационного кадра построчно, но это медленно, и я чувствую, что должен быть лучший способ с использованием apply, strsplit, paste и т. д. Есть ли быстрое и простое решение для этого?Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 апреля 2019

Используя tidyverse, separate_rows, мы можем сначала разделить каждый category на отдельную строку, а затем unite их в столбце keyword.

library(tidyverse)

startDF %>%
  separate_rows(categories) %>%
  unite(combo, keyword, categories, sep = " ")

#       uq_id              combo
#1      44ffd        citizen App
#2      44ffd citizen Restaurant
#3      44ffd      citizen Hotel
#4       t3dd        river Field
#5       t3dd        river Place
#6  rrk33--ds        mouse Movie
#7     limmt3          hello App
#8     limmt3        hello Hotel
#9     limmt3      hello Theater
#10    limmt3         hello Show

Базовый метод R мог быразделить запятую categories, повторив uq_id на основе length каждого category и создать новый кадр данных, вставив строку вместе с keyword, используя mapply.

list_cat <- strsplit(startDF$categories, ",")
data.frame(uq_id = rep(startDF$uq_id, lengths(list_cat)), 
           combo = unlist(mapply(paste, list_cat, startDF$keyword)))

Прочитайте startDF, используя stringsAsFactors = FALSE, чтобы сохранить их как символы вместо факторов.

0 голосов
/ 29 апреля 2019

Другая возможность tidyverse может быть:

startDF %>%
 mutate(categories = strsplit(as.character(categories), ", ", fixed = TRUE)) %>%
 unnest() %>%
 transmute(uq_id = uq_id,
           combo = paste(keyword, categories, sep = " "))

       uq_id              combo
1      44ffd        citizen App
2      44ffd citizen Restaurant
3      44ffd      citizen Hotel
4       t3dd        river Field
5       t3dd        river Place
6  rrk33--ds        mouse Movie
7     limmt3          hello App
8     limmt3        hello Hotel
9     limmt3      hello Theater
10    limmt3         hello Show
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...