首页 > 解决方案 > 使用 R 将变量添加到列表中的列表中的数据框

问题描述

我有一个关于新闻文章的社交媒体数据列表,该列表保存在每个新闻媒体的列表中。每次收集更多数据时,都会添加该列表。到目前为止,数据已被添加到每个列表中 9 次。

例如:这是对一个列表结果的一瞥

glimpse(buzzfeed200125[[1]])
List of 6
 $ results :'data.frame': 100 obs. of 45 variables:
            ..$ author_name: chr [1:100] "Amber Jamieson, Mary Ann Georgantopoulos, Marie Telling, Zorro Maplestone, Stephanie K. Baer, Hazel Shearing" "Stephanie K. Baer, Hazel Shearing" "Jason Leopold, Anthony Cormier" "Tasneem Nashrulla" ...
            ..$ youtube_trending_score: logi [1:100] NA NA NA NA NA NA ...
            ..$ alexa_rank: int [1:100] 1942 1942 1584 4354 1541 4354 1541 1264 4288 1584 ...
            ..$ pinterest_shares: int [1:100] 493 8 178 13 201 0 0 15 99 0 ...
            ..$ num_words: int [1:100] 1559 836 1506 1351 874 1351 874 925 392 1602 ...
 $ suggested_language: NULL
 $ total_pages       : int 71
 $ total_results     : num 7083
 $ display_code      : NULL
 $ search_type       : chr "domainSearch"

如您所见 - 实际数据收集的结果主要在列表中的第一个对象中 - 一个名为results

glimpse(buzzfeed200125[[1]][[1]])
Observations: 100
Variables: 45
$ author_name  <chr> "Amber Jamieson, Mary Ann Georgantopoulos, Marie Telling, Zorro Maplesto…
$ alexa_rank  <int> 1942, 1942, 1584, 4354, 1541, 4354, 1541, 1264, 4288, 1584, 4366, 2759, …
$ pinterest_shares  <int> 493, 8, 178, 13, 201, 0, 0, 15, 99, 0, 0, 22, 8, 26, 2, 136, 0, 39, 0, 7…
$ num_words   <int> 1559, 836, 1506, 1351, 874, 1351, 874, 925, 392, 1602, 392, 1366, 548, 5…
$ twitter_shares  <int> 3170, 2883, 149984, 4098, 754, 2, 4, 1328, 7925, 44, 1, 5262, 5017, 8248…
$ love_count  <int> 1004, 55009, 2457, 90, 33386, NA, NA, 3779, 31648, NA, NA, 9226, 312, 12…
$ language  <chr> "en", "en", "en", "en", "en", "en", "en", "en", "en", "en", "en", "en", …

我还有一个收集数据的每小时的 POSIX 时间戳列表

collection.time
collection.time[1:9]
[[1]]
[1] "2020-01-31 08:44:23 EST"

[[2]]
[1] "2020-01-31 10:50:01 EST"

[[3]]
[1] "2020-01-31 11:50:01 EST"

[[4]]
[1] "2020-01-31 12:50:00 EST"

[[5]]
[1] "2020-01-31 13:50:01 EST"

[[6]]
[1] "2020-01-31 14:50:01 EST"

[[7]]
[1] "2020-01-31 15:50:01 EST"

[[8]]
[1] "2020-01-31 16:50:01 EST"

[[9]]
[1] "2020-01-31 17:50:01 EST"

我想将时间戳作为变量添加到结果数据框中,以便我可以取消列表并将其转换为时间序列面板。

我的目标是让最终的数据框看起来像:

glimpse(df)

df : data.frame: 37800 obs. of 45 variables:
     .$ time.stamp chr [1:37800] "2020-01-31 08:44:23 EST" "2020-01-31 08:44:23 EST" "2020-01-31 08:44:23 EST" "2020-01-31 08:44:23 EST" "2020-01-31 08:44:23 EST" ...
     .$ author_name: chr [1:37800] "Amber Jamieson, Mary Ann Georgantopoulos, Marie Telling, Zorro Maplestone, Stephanie K. Baer, Hazel Shearing" "Stephanie K. Baer, Hazel Shearing" "Jason Leopold, Anthony Cormier" "Tasneem Nashrulla" ...
     .$ youtube_trending_score: logi [1:37800] NA NA NA NA NA NA ...

我设法提取并创建了所有源的大型数据框,但没有添加 time.stamp 变量。到目前为止,这是我的代码:

load(file = "source_list")

source_list 是一个列表,其中包含每个新闻源的列表

所以结构是

source_list[[source]][[time collected]][[results data frame]]

tab1 <- tibble(source_list) %>% unnest_wider(source_list) %>% unnest(results)

tab1

# A tibble: 37,795 x 50
   author_name youtube_trendin… alexa_rank pinterest_shares num_words twitter_shares love_count language
   <chr>                  <dbl>      <int>            <int>     <int>          <int>      <int> <chr>   
 1 The Babylo…               NA       9019               11       251          22991       3130 en      
 2 The Babylo…               NA      23970                9       306            696       1551 en      
 3 The Babylo…               NA      17002               13       343           2504       1687 en      
 4 The Babylo…               NA      19717               10       233          11219       2897 en      
 5 The Babylo…               NA      13077               24       241           8180       1418 en      
 6 The Babylo…               NA      47714                4       228            578        395 en      
 7 The Babylo…               NA      22741                5       261           3613       2132 en      
 8 The Babylo…               NA      14996               12       231           1646         69 en      
 9 The Babylo…               NA      26529                2       350           3773       1265 en      
10 The Babylo…               NA      17002               10       277           6995       6863 en      
# … with 37,785 more rows, and 42 more variables

但我不知道如何将时间戳正确添加为变量。

我试过用rep正确的次数重复时间戳,但到目前为止还没有任何效果。

看起来像这样:

time.stamp <- rep(rep(collection.time[1:9], each = 100),378)

结果对象与数据框的长度tab1不同

对于简化此过程或向最终数据集添加时间戳变量的任何帮助将不胜感激。

标签: rdataframedplyrnested-lists

解决方案


也许在取消嵌套之前将时间戳添加到每个数据帧会更简单?

buzzfeed200125 <- mapply(function(x, y){ x$results$time <- rep(y, nrow(x$results)); x;},
                         buzzfeed200125, collection.time, SIMPLIFY = FALSE)

这应该为您提供每行所需的时间戳输出。


推荐阅读