将包含多个列表的嵌套数据帧转换为可用的数据帧/ tibble

时间:2017-11-16 18:42:25

标签: r dataframe data.table tidyverse

我正在使用R中的一个程序包,它会为我在csv文件中提供的站点列表中的天气变量进行吐出。数据以包含多个列表的数据框形式出现,因此每个站点都有一个列表。在每个站点的每个列表中,都有关于站点名称,纬度,长度,高度和磁贴的信息,该站点的数据是包含9个变量的数据框。通过在此处运行代码来查看输出可能是最好的:

library(tidyverse)
if(!require(devtools)){install.package(devtools)}
devtools::install_github("khufkens/daymetr")
library(daymetr)

' my_sites.csv'下面看起来像这样,这里没有列标题,只有站点名称和lat long(总共3列):

Alpha 43.29515  -89.29077  
Delta  44.14667 -121.34722

weather_by_site<-download_daymet_batch(file_location = '/Users/Jay/Desktop/my_sites.csv',
                      start = 2012,
                      end = 2016,
                      internal = TRUE)

这可以让您更好地了解输出结果:

str(weather_by_site)

我希望将输出与9个天气变量与每个站点的站点名称和磁贴相结合。目标是运行相同的代码但是对于> 600个站点,并且能够以更整洁的数据帧或tibble格式分析数据。所以基本上我会从2012-2016获得一个站点的数据,并且所有站点都将绑定在一起。

1 个答案:

答案 0 :(得分:1)

使用purrr,我们可以遍历每个结果,从结果中获取数据帧,然后将其他变量推送到该数据帧的末尾:

library(dplyr)
library(purrr)

# write a function to do pull out the data frame
# then append the other values
tidyweather  <- function(x) {

    datadf  <- pluck(x, "data")
    datadf$site       <- x[[1]]
    datadf$lattitude  <- x[[2]]
    datadf$longitude  <- x[[3]]
    datadf$altitude   <- x[[4]]
    datadf$tile       <- x[[5]]

    return(datadf)
}


weather_df  <- weather_by_site %>%
    # run tidyweather() on each result and return one big data frame
    map_df(tidyweather)