вкладывает тиблы, выполняет операции, вкладывает и вкладывает данные в другой форме - PullRequest
1 голос
/ 04 мая 2019

Это продолжение вопроса к более раннему вопросу здесь . Я хочу принять это немного дальше, но не знаю, как.

Что я хочу сделать, это извлечь квинтили для каждого Sepal_width, Petal_width и т. Д. И сохранить их как вложенный тиббл.

Вместо Species у меня фактически есть данные временных рядов по годам (поэтому я вкладываю их в эти годы), поэтому я действительно хочу вычислить квинтиль числа столбцов в этом году (в отличие от Sepal.length и т. Д.). ), а затем вытащите все квинтили 1 за все годы, объедините их в один фрейм данных временных рядов за все годы и затем вложите их обратно на основе квинтилей.

Я знаю, что название может быть немного запутанным, поэтому я пытаюсь сделать следующее:

1) Вложить данные по «году / (виду)»

2) Вычислить квинтили для числа столбцов

3) удалить данные, где все квинтили равны 1, затем 2, затем 3 ... и т. Д., Поэтому все годы / (виды) возвращаются в общей сложности 5 кадров данных (или, надеюсь, новые вложенные тиблы)

4) Обновите данные по квинтилям (которые теперь содержат все годы / (виды)

Таким образом, у меня будет вложенный столбик из 5 блоков (по одному на каждый квинтиль), где каждый фрагмент состоит из всех лет (видов), объединенных обратно

Данные:

data(iris)

iris_quintiles <- iris %>%
  as_tibble() %>%
  group_by(Species) %>%
  nest(.key = "data") %>% 
  mutate(Sep_len = map(data, ~select(.x, Species, Sepal.Length)),
         Sep_len = map(Sep_len, ~mutate(.x, quantile_Sep_len = ntile(Sepal.Length, 5))),
         Sep_wid = map(data, ~select(.x, Species, Sepal.Width)),
         Sep_wid = map(Sep_wid, ~mutate(.x, quantile_Sep_wid = ntile(Sepal.Width, 5))),
         Pet_len = map(data, ~select(.x, Species, Petal.Length)),
         Pet_len = map(Pet_len, ~mutate(.x, quantile_Pet_len = ntile(Petal.Length, 5))),
         Pet_wid = map(data, ~select(.x, Species, Petal.Width)),
         Pet_wid = map(Pet_wid, ~mutate(.x, quantile_Pet_wid = ntile(Petal.Width, 5))))

iris_quintiles

# Here is where it gets a little messy and what I am currently doing
# is extracting them individually but I will have to do this for quantile_Sen_len, quantile_Pet_len, quantile_Pet_wid etc. where the code gets quite large

df1 <- iris_quintiles %>%
  unnest() %>%
  filter(quantile_Sep_len == 1)


df2 <- iris_quintiles %>%
  unnest() %>%
  filter(quantile_Sep_len == 2)


df3 <- iris_quintiles %>%
  unnest() %>%
  filter(quantile_Sep_len == 3)


df <- list(df1, df2, df3)

df <- plyr::ldply(df, data.frame)


df %>%
  group_by(Species) %>%
  nest(.key = "data")

Ожидаемый результат: - Не «точно», но более или менее близко.

# A tibble: 3 x 6
  QUINTILES    data              Sep_len           Sep_wid           Pet_len           Pet_wid          
  <fct>      <list>            <list>            <list>            <list>            <list>           
1 quintile_1     <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 5]>
2 quintile_2 <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 5]>
3 quintile_3  <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 5]>
3 quintile_4  <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 5]>
3 quintile_5  <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 4]> <tibble [50 x 5]>

Игнорировать размеры тиббла, так как я скопировал и вставил этот тиббл и немного его изменил.

Таким образом, есть 5 столовых - по одному на каждый квантиль sep_len, sep_wid, pet_len и pet_wid состоят из всех данных (для всех видов) - т.е. до того, как вложенный тиббл, вложенный в Species - выполнил операцию квинтиля и затем использовал что-то вроде этого

df1 <- iris_quintiles %>% unnest() %>% filter(quantile_Sep_len == 1)

позволило мне извлечь квинтиль = 1 для всех 3 видов. Таким образом, здесь df1 в основном должно быть Sep_len в приведенном выше столбце для quintile_1. Следующее:

df2 <- iris_quintiles %>% unnest() %>% filter(quantile_Sep_len == 2)

будет sep_len для quintile_2 в том же столбце.

1 Ответ

2 голосов
/ 04 мая 2019

Мы можем циклически перебрать имена столбцов 'iris_quintiles', unnest, затем nest и reduce в одном наборе данных

library(tidyverse)
map(names(iris_quintiles)[-(1:2)], ~  
       iris_quintiles %>% 
         select(Species, .x) %>%
         unnest %>% 
         rename_at(vars(matches("quantile")), ~ "QUINTILES") %>%
         group_by(QUINTILES = str_c("quintile_", QUINTILES)) %>% 
         nest(.key = !!.x)) %>% 
         reduce(inner_join, by = "QUINTILES") %>% 
         arrange(factor(QUINTILES, levels = str_c("quintile_", 1:5)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...