R - работа со списком в списке фреймов данных - PullRequest
0 голосов
/ 30 июня 2018

У меня есть список из двух фреймов данных df1 and df2. Каждый фрейм данных содержит три столбца val1 val2 and bb. В bb вложен другой список из 2 с четырьмя столбцами - см. tail(my.list$df1, n=3) ниже.

Когда я экспортирую с использованием write.csv, все столбцы присутствуют в файле .csv, и вывод выглядит точно так же, как tail(my.list$df1, n=3). Тем не менее, я хотел бы - из-за отсутствия лучших терминов - переместить столбцы bb.dn bb.mavg bb.up bb.pctB на один уровень вверх, чтобы я мог вызывать, манипулировать и / или объединять столбцы bb.dn bb.mavg bb.up bb.pctB с другими фреймами данных или списками в моем код.

Воспроизводимый:

library(TTR)
library(tidyverse)
library(plyr)

# reproducible example
set.seed(1363)
d1 <- data.frame(val1 = c(rnorm(n=65, mean=15)), val2 = c(rnorm(n=65, 
mean=15)))
d2 <- data.frame(val1 = c(rnorm(n=35, mean=12)), val2 = c(rnorm(n=35, 
mean=25)))
my.list <- list(df1 = d1, df2 = d2)

for (i in seq_along(my.list)) {
  my.list[[i]] <- my.list[[i]] %>%
    mutate(bb = BBands(val2, n = 20, sd = 2))
}

Это структура фрейма данных 2 в my.list:

> str(my.list$df2)
'data.frame':   35 obs. of  3 variables:
$ val1: num  11.1 11.4 10.9 13.9 12.6 ...
$ val2: num  25.1 25.7 24.6 25.2 26 ...
$ bb  : num [1:35, 1:4] NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "dn" "mavg" "up" "pctB"

Это список в «списке из 2», который содержит 4 столбца, которые я хотел бы поднять на один уровень вверх:

> tail(my.list$df1, n=3)
     val1     val2      bb.dn    bb.mavg      bb.up    bb.pctB
63 16.29825 15.64776 13.4178099 15.3927881 17.3677663  0.5645507
64 15.89625 14.77928 13.4214305 15.3943781 17.3673258  0.3441171
65 12.59590 15.43764 13.4202751 15.3533071 17.2863391  0.5218149
> 

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Мы можем использовать map от purrr

library(purrr)
map(my.list, as.data.frame.list) 

данные

set.seed(1363)
d1 <- data.frame(val1 = c(rnorm(n=65, mean=15)), 
            val2 = c(rnorm(n=65, mean=15)))

d2 <- data.frame(val1 = c(rnorm(n=35, mean=12)), 
             val2 = c(rnorm(n=35, mean=25)))
my.list <- list(df1 = d1, df2 = d2) 
for(i in seq_along(my.list)) my.list[[i]][["bb"]] <- 
                              BBands(my.list[[i]]$val2, n=20, sd = 2)
0 голосов
/ 30 июня 2018

Вы ищете:

 setNames(Map(do.call,c(data.frame),my.list),names(my.list))
...