Доступ ко всем столбцам с определенным именем во вложенных списках в R - PullRequest
1 голос
/ 30 марта 2020

Интересно, как мне получить доступ ко всем столбцам с определенным именем во вложенных списках. Ниже приведен воспроизводимый пример. Как я могу вызвать все «средние» столбцы и сопоставить все в одном data.frame, где data.frame как два других столбца, которые определяют связанные классы и Output1 / Output2 (Пример 1). Пример 2 немного сложнее, где вложенный «средний» список представляет собой data.frame. Мне нужно получить доступ к столбцам "ts" и "value". Другими словами, мне нужно знать ts, соответствующие каждому значению (в дополнение к классам и Output1 / Output2).

Пример 1

classes <- c("F", "G", "M", "O")
classes <- structure(unique(classes), names = unique(classes))

S1 = data.frame(X1 = rnorm(100), X2 = rnorm(100), X3 = rnorm(100),  X4 = rep(classes, 25))
S2 = data.frame(X1 = rnorm(100), X2 = rnorm(100), X3 = rnorm(100),  X4 = rep(classes, 25))

P <- lapply(classes, function(c){
  Output1 <- list ("model" = lm(X3~ X1+X2, data = S1),"mean" = apply(S1[S1$X4 == c, 1:3], 2, mean), "sum" = apply(S1[S1$X4 == c, 1:3], 2, sum))
  Output2 <- list ("model" = lm(X3~ X1+X2, data = S2), "mean" = apply(S2[S2$X4 == c, 1:3], 2, mean), "sum" = apply(S2[S2$X4 == c, 1:3], 2, sum))
  output <- list ("Output1" = Output1, "Output2" = Output2)
  return(output)
})

Пример 2

classes <- c("F", "G", "M", "O")
classes <- structure(unique(classes), names = unique(classes))

S1 = data.frame( X1 = rnorm(100), X2 = rnorm(100), X3 = rnorm(100),  X4 = rep(classes, 25), ts = seq(from = ISOdate(1910,1,1),  by = "30 min", length.out = 100 ))
S2 = data.frame( X1 = rnorm(100), X2 = rnorm(100), X3 = rnorm(100),  X4 = rep(classes, 25),ts = seq(from = ISOdate(1910,1,1),  by = "30 min", length.out = 100 ))

P <- lapply(classes, function(c){
  Output1 <- list ("model" = lm(X3~ X1+X2, data = S1),"mean" = data.frame(ts = S1[S1$X4 == c, "ts"], 
                                                                          value = S1[S1$X4 == c, "X1"]) ,
                   "sum" = apply(S1[S1$X4 == c, 1:3], 2, sum))
  Output2 <- list ("model" = lm(X3~ X1+X2, data = S2),
                   "mean" = data.frame(ts = S2[S2$X4 == c, "ts"],
                                       value = S2[S2$X4 == c, "X1"]), 
                   "sum" = apply(S2[S2$X4 == c, 1:3], 2, sum))
  output <- list ("Output1" = Output1, "Output2" = Output2)
  return(output)
})

1 Ответ

4 голосов
/ 30 марта 2020

Мы можем получить «средние» столбцы из P, используя rvest s pluck и связать их вместе с map_df.

purrr::map_df(P, ~rvest::pluck(.x, "mean"), .id = "Class")

# A tibble: 12 x 3
#   Class Output1 Output2
#   <chr>   <dbl>   <dbl>
# 1 F      0.0315 -0.0946
# 2 F      0.0935  0.219 
# 3 F      0.155   0.172 
# 4 G      0.123   0.182 
# 5 G     -0.114  -0.128 
# 6 G     -0.0654 -0.0990
# 7 M      0.111   0.0794
# 8 M     -0.176   0.405 
# 9 M      0.265  -0.0747
#10 O      0.0207 -0.250 
#11 O     -0.0407  0.0117
#12 O     -0.162  -0.195 

В базе R вы можете сделать:

temp <- lapply(P, function(x) sapply(x, `[[`, "mean"))
do.call(rbind, Map(cbind.data.frame, temp, Class = names(temp)))

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

Для примера с фреймом данных мы можем использовать bind_rows после pluck.

map_df(P, ~rvest::pluck(.x, "mean") %>% bind_rows(.id= "output"), .id = "Class")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...