Реструктуризация вложенного списка - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю с вложенным списком (наземные датчики) списков (измерения глубины) списков (фреймы данных за каждый год с 2014-2018). 'SE' обозначает датчик и его номер, а 'd' обозначает глубину, на которой датчик находится в почве. выглядит следующим образом:

str(GRP3_OUT_gwFERN)

List of 9
 $ SE10:List of 3
  ..$ d20:List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : logi [1:8760] NA NA NA NA NA NA ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : logi [1:8760] NA NA NA NA NA NA ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : logi [1:8784] NA NA NA NA NA NA ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : num [1:8760] NA NA NA NA NA NA NA NA NA NA ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : logi [1:8760] NA NA NA NA NA NA ...
  ..$ d50:List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : num [1:8760] 39.8 39.7 39.8 39.7 39.7 ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : num [1:8760] 39.7 39.7 39.7 39.7 39.7 ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : num [1:8784] 39 39.1 39.1 39 39 ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : num [1:8760] 37.9 38 37.9 37.9 37.9 ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : num [1:8760] 39.1 39 39.1 39 39 ...
  ..$ d5 :List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : num [1:8760] 41 41 40.9 41 40.9 ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : num [1:8760] 42 42.1 42.1 42 42.1 ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : num [1:8784] 43.3 43.4 43.4 43.3 43.3 ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : num [1:8760] 42.1 42.1 42.2 42.1 42.1 ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : num [1:8760] 44 44.1 44.1 44.1 44.1 ...
 $ SE11:List of 3
  ..$ d20:List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : num [1:8760] 46.6 46.5 46.4 46.4 46.4 ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : num [1:8760] 46.6 46.5 46.6 46.6 46.6 ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : num [1:8784] 45.1 45.1 45.1 45.1 45.1 ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : num [1:8760] 40.2 40.2 40.2 40.2 40.2 ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : num [1:8760] 49.1 49.2 49.3 49.2 49.3 ...
  ..$ d50:List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : num [1:8760] 34.1 34 34.1 34 34 ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : num [1:8760] 32.8 32.8 32.8 32.7 32.7 ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : logi [1:8784] NA NA NA NA NA NA ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : logi [1:8760] NA NA NA NA NA NA ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : logi [1:8760] NA NA NA NA NA NA ...
  ..$ d5 :List of 5
  .. ..$ 2014:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2014-01-01" "2014-01-01" "2014-01-01" ...
  .. .. ..$ SWC : num [1:8760] 33.8 33.8 33.8 33.8 33.7 ...
  .. ..$ 2015:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2015-01-01" "2015-01-01" "2015-01-01" ...
  .. .. ..$ SWC : num [1:8760] 35.7 35.7 35.7 35.7 35.7 ...
  .. ..$ 2016:'data.frame': 8784 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8784], format: "2016-01-01" "2016-01-01" "2016-01-01" ...
  .. .. ..$ SWC : num [1:8784] 31.5 31.5 31.5 31.5 31.5 ...
  .. ..$ 2017:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2017-01-01" "2017-01-01" "2017-01-01" ...
  .. .. ..$ SWC : num [1:8760] 28.3 28.3 28.3 28.2 28.2 ...
  .. ..$ 2018:'data.frame': 8760 obs. of  2 variables:
  .. .. ..$ Date: Date[1:8760], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  .. .. ..$ SWC : num [1:8760] 35.4 35.5 35.6 35.5 35.4 ..

Поскольку все кадры данных содержат значения NA, я хочу выполнить линейную регрессию, чтобы заполнить промежутки значениями NA. Я думаю, что для этого мне нужно реструктурировать свой список таким образом, чтобы я получил план данных за 2014 год, глубину 20 и все датчики, которые есть в списке за тот же год и глубину . Затем на следующем кадре данных будет то же самое для 2015 года, в следующем на 2016 год и так далее ...

Почему я хочу это сделать? Потому что для выполнения линейной регрессии я хочу создать индикаторную переменную в новом столбце для (как пример) SE11 и заполнить промежутки NA значениями от другого датчика, где коэффициент корреляции самый высокий . Вот как это должно выглядеть в 2014 году, например:

 SE11_d20_2014_SWC SE12_d20_2014_SWC SE_44_d20_2014_SWC
             2            NA              4
             3             2              6
             NA            3             NA
             6            NA              3

 SE11_d50_2014_SWC SE12_d50_2014_SWC SE_44_d50_2014_SWC
             2            NA              4
             3             2              6
             4             5              4
            NA             3             NA
             6            NA              3


 SE11_d5_2014_SWC SE12_d5_2014_SWC SE_44_d5_2014_SWC
             2            NA              4
             3             2              6
             4             5              4
            NA             3             NA
             6            NA              3

Я уже провел некоторое исследование и искал списки реструктуризации, но, к сожалению, не смог найти ничего, что могло бы помочь меня. Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ для Тойдата: (копия моего списка и его структура)

dat <- setNames(replicate(3, setNames(replicate(3, setNames(lapply(2014:2018, function(y) {
    d <- expand.grid(date=as.Date(as.character(seq(ISOdate(y, 1, 1, 0), ISOdate(y, 12, 31, 0), by="day"))), 
                     hour=1:24)
    d$swc <- rnorm(nrow(d))
    d[order(d$date), -2]
}), 2014:2018), simplify=F), c("d20", "d50", "d5")), simplify=F), c("SE104", "SE105", "SE106"))

Фил

1 Ответ

0 голосов
/ 30 апреля 2020

Полагаю, вам просто нужно преобразовать list в data.frame и сохранить всю информацию о вложенности. Затем вы можете отфильтровать его в соответствии с вашими потребностями.

Вы можете сделать это с помощью for() l oop.

Я создал некоторые данные, чтобы продемонстрировать это:

vec_a <- c(1,2,3)
vec_b <- c(10,20,30)

l <- list(
  top1 = list(
    middle1 = list(
      a=vec_a,
      b=vec_b
    ),
    middle2 = list(
      a=vec_a,
      b=vec_b
    )
  ),
  top2 = list(
    middle1 = list(
      a=vec_a,
      b=vec_b
    ),
    middle2 = list(
      a=vec_a,
      b=vec_b
    )
  ),
  top3 = list(
    middle1 = list(
      a=vec_a,
      b=vec_b
    ),
    middle2 = list(
      a=vec_a,
      b=vec_b
    )
  )
)

str(l)
#> List of 3
#>  $ top1:List of 2
#>   ..$ middle1:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30
#>   ..$ middle2:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30
#>  $ top2:List of 2
#>   ..$ middle1:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30
#>   ..$ middle2:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30
#>  $ top3:List of 2
#>   ..$ middle1:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30
#>   ..$ middle2:List of 2
#>   .. ..$ a: num [1:3] 1 2 3
#>   .. ..$ b: num [1:3] 10 20 30

library(tidyverse)

d <- data.frame()

for (i in seq_along(l)){
  df <- l[[i]] %>% bind_rows(.id = "level2") %>% 
    mutate(level1 = names(l)[i])
  d <- d %>% bind_rows(df)
}

d
#>     level2 a  b level1
#> 1  middle1 1 10   top1
#> 2  middle1 2 20   top1
#> 3  middle1 3 30   top1
#> 4  middle2 1 10   top1
#> 5  middle2 2 20   top1
#> 6  middle2 3 30   top1
#> 7  middle1 1 10   top2
#> 8  middle1 2 20   top2
#> 9  middle1 3 30   top2
#> 10 middle2 1 10   top2
#> 11 middle2 2 20   top2
#> 12 middle2 3 30   top2
#> 13 middle1 1 10   top3
#> 14 middle1 2 20   top3
#> 15 middle1 3 30   top3
#> 16 middle2 1 10   top3
#> 17 middle2 2 20   top3
#> 18 middle2 3 30   top3

Создано в 2020-04-30 пакетом Представить (v0.3.0)

...