Извлекать вложенные данные из фрейма данных - PullRequest
0 голосов
/ 17 апреля 2020

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

name <- c("impressions_unique","impressions_paid_unique","impressions_organic_unique")
period <- c("lifetime","lifetime","lifetime")
l1 <- list(data.frame(value = 33395))
l2 <- list(data.frame(value = 0))
l3 <- list(data.frame(value = 33395))
values <- c(l1,l2,l3)
title <- c("Lifetime Post Total Reach","Lifetime Post Paid Reach","Lifetime Post organic reach")
description <- c("Lifetime","Lifetime","Lifetime")
id <- c(125698,432566,759832)

df <- data.frame(name,period,title,description,id)
df$values <- values


name <- c("impressions_unique","impressions_paid_unique","impressions_organic_unique")
period <- c("lifetime","lifetime","lifetime")
l3 <- list(data.frame(value = 12345))
l4 <- list(data.frame(value = 55))
l5 <- list(data.frame(value = 12400))
values2 <- c(l3,l4,l5)
title <- c("Lifetime Post Total Reach","Lifetime Post Paid Reach","Lifetime Post organic reach")
description <- c("Lifetime","Lifetime","Lifetime")
id2 <- c(023698,212566,356832)

df1 <- data.frame(name,period,title,description,id)
df1$values <- values2


 Message <- c("The weather is sunny","Tomorrow is going to be raining")
 insights.data <- c(list(df),list(df1))
 created_time <- c(2020-02-28, 2020-02-25)
 ID <- c(062742003618463-1401305690071373,062742003618463-1401305690071374)

 full_df <- data.frame(Message,created_time,ID)
 full_df$insights.data <- insights.data

Я хочу иметь столбцы full_df (кроме insights.data) и дополнительно три столбца: "impressionions_unique", "impressionions_paid_unique", "impressionions_organic_unique" вместе с их соответствующими значениями. Таким образом, окончательный кадр данных должен состоять из следующих столбцов:

   Message,impressions_unique,impressions_paid_unique,impressions_organic_unique,created_time,ID

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 17 апреля 2020

Можно распаковать вложенную структуру, используя unnest() из пакета tidyr. Вам нужно сделать это дважды, потому что insights.data - это список, содержащий фрейм данных, а внутри значений этого фрейма данных находится еще один список, содержащий фрейм данных. Это увеличит количество строк в 3 раза, поскольку фрейм данных в столбце insights.data состоит из трех строк. Мы можем объединить эти строки в столбцы, используя pivot_wider() (также из пакета tidyr. Имя spread() в предыдущих версиях).

Надеюсь, я правильно понял вопрос.

library(dplyr)
library(tidyr)

full_df %>% 
  unnest(insights.data) %>% 
  unnest(values) %>% 
  select(Message, created_time, ID, name, value) %>% 
  pivot_wider(names_from = name, values_from = value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...