Применение функций к столбцам во вложенном фрейме данных

У меня есть данные, которые я вкладываю в столбцы списка, тогда я хотел бы использовать purrr :: map () для применения функции построения графика отдельно к каждому столбцу во вложенных фреймах данных. Минимальный воспроизводимый пример:

library(dplyr)
library(tidyr)
library(purrr)

data=data.frame(Type=c(rep('Type1',20),
                       rep('Type2',20),
                       rep('Type3',20)),
                Result1=rnorm(60),
                Result2=rnorm(60),
                Result3=rnorm(60)
                )

dataNested=data%>%group_by(Type)%>%nest()

Скажем, я хотел сгенерировать гистограмму для Result1: Result3 для каждого элемента dataNested $ data:

dataNested%>%map(data,hist)

Любая итерация моего кода не будет отдельно перебирать столбцы внутри каждого вложенного фрейма данных.


person scs217    schedule 09.10.2017    source источник
comment
Что именно означает «создать гистограмму для Result1: Result3»? Одна гистограмма объединенных данных? Три гистограммы на Type?   -  person liborm    schedule 09.10.2017


Ответы (3)


Зачем вам нужно так усложнять, если вы уже в tidyverse? Столбцы списка - это скорее последнее средство решения проблем.

library(tidyverse)

data %>%
  gather(result, value, -Type) %>%
  ggplot(aes(value)) + 
  geom_histogram() + 
  facet_grid(Type ~ result)

gather переформатирует широкий набор данных в длинный с Type столбцом, result столбцом и value столбцом, где находятся все числа.

person liborm    schedule 09.10.2017
comment
Мое приложение намного больше по объему с точки зрения данных и моих результатов. Сложность мурлыканья очень меня спасает с точки зрения результатов. - person scs217; 09.10.2017
comment
Большая сложность означает, что сохранение данных в красивой прямоугольной форме еще более важно;) Сложные проблемы требуют простых решений. - person liborm; 09.10.2017
comment
Мне нужно вычислить значения и передать эти списки в мой вывод в качестве аргументов, избавив меня от тонны ручного кодирования. Вот что мне дает мурррр. - person scs217; 10.10.2017
comment
Я не возражаю против purrr, я часто им пользуюсь. Просто, если Google приведет сюда кого-то, кто только пытается построить девять гистограмм, столбцы со списками не подходят. Если вы более точно укажете желаемый результат, я могу попытаться придумать чистый мурлыкающий ответ @ scs217. - person liborm; 10.10.2017

Возможно, не создавайте вложенный фрейм данных. Мы можем разделить фрейм данных по столбцу Type и построить гистограмму.

library(tidyverse)

dt %>%
  split(.$Type) %>%
  map(~walk(.[-1], ~hist(.)))

ДАННЫЕ

library(tidyverse)

set.seed(1)

dt <- data.frame(Type = c(rep('Type1', 20),
                          rep('Type2', 20),
                          rep('Type3', 20)),
                 Result1 = rnorm(60),
                 Result2 = rnorm(60),
                 Result3 = rnorm(60),
                 stringsAsFactors = FALSE)
person www    schedule 09.10.2017
comment
Обратите внимание, что для отображения всех гистограмм 3x3 вам понадобится op <- par(mfrow = c(3, 3)), а после графика par(op) для сброса параметров графики. - person Rui Barradas; 09.10.2017

Так что я думаю, что вы правильно думаете об этом. Запуск этого кода:

dataNested$data[[1] 

Вы видите, что у вас есть данные, которые можно перебирать. Вы можете пройти через это так:

for(i in dataNested) {
print(i)
} 

Это наглядно демонстрирует, что конструкция не слишком сложна для работы. Итак, как создавать гистограммы? Мы можем создать вспомогательную функцию:

helper_hist <- function(df) {
               lapply(df, hist)
}

И запустите, используя:

 map(dataNested$data, helper_hist)

Надеюсь это поможет.

person jacobsg    schedule 09.10.2017