Автоматически размещать данные в большом списке, который содержит списки, содержащие кадры данных - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь решить (для меня очень сложную) проблему. Я сделаю все возможное, чтобы объяснить это.

Я работаю со списком, который содержит 150 других списков. Эти подсписки содержат 3 кадра данных каждый. Вот str() из списка, который содержит 150 списков, содержащих кадры данных:

str(listSM)

$ SE1  :List of 3
  ..$ d20:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d50:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d5 :'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ SE10 :List of 3
  ..$ d20:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d50:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d5 :'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ SE100:List of 3
  ..$ d20:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d50:'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
  ..$ d5 :'data.frame': 96408 obs. of  2 variables:
  .. ..$ Date: Date[1:96408], format: "2009-01-01" "2009-01-01" "2009-01-01" ...
  .. ..$ SWC : num [1:96408] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...

Приведенный выше код показывает только 3 кадра данных. Они называются SE1, SE2, SE3, SE4,… вплоть до SE150. В этих списках всегда есть 3 кадра данных с одинаковыми именами в каждом списке, а именно: d20, d50 и d5.

Вот что я хочу сделать:

Я хочу создать несколько подмножеств для каждого кадра данных (d20, d50, d5) в каждом списке на основе даты и сохранить их в новая переменная с уникальным именем. Каждый фрейм данных содержит даты 2009-2019 гг.

Я написал это в качестве примера:

        SE1_d20_2009 <- subset(listSM$SE1$d20, Date <= "2009-12-31 23:00:00")
        SE1_d20_2010 <- subset(listSM$SE1$d20, Date > "2009-12-31 23:00:00" & Date <= "2010-12-31 23:00:00")
        SE1_d20_2011 <- subset(listSM$SE1$d20, Date > "2010-12-31 23:00:00" & Date <= "2011-12-31 23:00:00")
        SE1_d20_2012 <- subset(listSM$SE1$d20, Date > "2011-12-31 23:00:00" & Date <= "2012-12-31 23:00:00")
        SE1_d20_2013 <- subset(listSM$SE1$d20, Date > "2012-12-31 23:00:00" & Date <= "2013-12-31 23:00:00")
        SE1_d20_2014 <- subset(listSM$SE1$d20, Date > "2013-12-31 23:00:00" & Date <= "2014-12-31 23:00:00")
        SE1_d20_2015 <- subset(listSM$SE1$d20, Date > "2014-12-31 23:00:00" & Date <= "2015-12-31 23:00:00")
        SE1_d20_2016 <- subset(listSM$SE1$d20, Date > "2015-12-31 23:00:00" & Date <= "2016-12-31 23:00:00")
        SE1_d20_2017 <- subset(listSM$SE1$d20, Date > "2016-12-31 23:00:00" & Date <= "2017-12-31 23:00:00")
        SE1_d20_2018 <- subset(listSM$SE1$d20, Date > "2017-12-31 23:00:00" & Date <= "2018-12-31 23:00:00")
        SE1_d20_2019 <-subset(listSM$SE1$d20, Date > "2018-12-31 23:00:00" & Date <= "2019-12-31 23:00:00"

Как вы можете видеть, я хочу делать ежегодные подмножества. Кроме того, имена переменных зависят от числа SE и числа d . Это данные измерения влажности почвы, поэтому SE обозначает датчик, а d - глубину датчика. Приведенный выше код является примером для имен переменных для SE1 и d20, поэтому имена для SE2 должны быть: SE2_d20_2009, SE2_d20_2010 и т. Д. Но, конечно, я хочу не просто сделать это для d20, но также для d5 и d50, поэтому имена переменных для этих глубин будут: SE2_d5_2009, SE2_d5_2010 // SE2_d50_2009, SE2_d50_2010 и т. д.….

Очевидно, что я мог бы сделать это для каждого кадра данных в списках, как указано выше, но это всего 450 кадров данных, и это займет слишком много времени. Поэтому мне интересно, можно ли это автоматизировать, и если да, то как? Так как я начинающий в R, это выходит за рамки моей компетенции, поэтому я очень надеюсь, что кто-нибудь сможет мне помочь. Не стесняйтесь задавать любые вопросы, если это непонятно, я старался изо всех сил, чтобы объяснить это.

РЕДАКТИРОВАТЬ:

dput(droplevels(listSM$SE1$d20[1:50, ]))

structure(list(Date = structure(c(14245, 14245, 14245, 14245, 
14245, 14245, 14245, 14245, 14245, 14245, 14245, 14245, 14245, 
14245, 14245, 14245, 14245, 14245, 14245, 14245, 14245, 14245, 
14245, 14245, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 
14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 
14246, 14246, 14246, 14246, 14246, 14246, 14246, 14246, 14247, 
14247), class = "Date"), SWC = c(NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 
NaN, NaN, NaN, NaN, NaN)), row.names = c(NA, 50L), class = "data.frame")

1 Ответ

2 голосов
/ 01 апреля 2020

Вы можете попробовать:

list_df <- lapply(listSM, function(x) 
             lapply(x, function(y) split(y, format(y$Date, "%Y"))))

Это вернет список списков в виде вывода в list_df. Хорошо хранить данные в списках, поскольку ими легко управлять, а не иметь много объектов в глобальной среде.

Если вы хотите использовать список с одним уровнем вместо списков списков, выполните

unlist(list_df, recursive = FALSE)
...