嵌套tibbles,以不同形式执行操作,非努力和嵌套数据



这是在此处提出的问题。我希望对此有些烦恼,但不确定如何。

我想做的是为每个Sepal_widthPetal_width等提取五分之一,然后将它们存储为嵌套的tibble。

而不是Species,我实际上有多年的时间序列数据(所以我在这些年中筑巢(,所以我实际上想计算当年的许多列的五分之一(与Sepal.length等(,然后拉拉将1的所有五分位数始终多年组合成一个时间序列数据框架,然后根据五分位数将其嵌套。

我知道标题可能有些混乱,所以我要做的是:

1(用"年/(物种("嵌套数据

2(计算许多列的五分之一

3(毫无疑问,所有五分位数等于1,然后是3 ...等的数据,因此所有年份/(物种(总共将5个数据帧(或希望是新的嵌套tibbles(

4(用五分位数恢复数据(现在包含所有年份/(物种(

因此,我将有一个5个tibbles的嵌套(每个五分之一(,其中每个tibble由所有年份组成(物种(合并在一起

数据:

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]>

忽略蒂布布尔的大小,因为我复制并粘贴了这个tibble并将其修改了一点。

因此,有5个tibbles-每个分位数一个。sep_lensep_widpet_lenpet_wid由所有数据(对于所有物种(组成 - 即在嵌套在Species上的嵌套tibble之前 - 执行了五分列式操作,然后使用此类似

>

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

允许我提取所有3个物种的五分之一= 1。因此,这里的df1基本上应为quintile_1的上述tibble中的Sep_len。以下内容:

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

对于同一tibble中的quintile_2将是sep_len

我们可以在'iris_quintiles', unnest,然后 nestreduce的列名上循环到一个数据集

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)))

最新更新