Это продолжение вопроса к более раннему вопросу здесь . Я хочу принять это немного дальше, но не знаю, как.
Что я хочу сделать, это извлечь квинтили для каждого 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
в том же столбце.