嵌套小动作,执行操作,嵌套和以其他形式嵌套数据

时间:2019-05-04 18:57:30

标签: r

这是对先前问题here的质疑。我想进一步了解一下,但不确定如何。

我想做的是分别提取Sepal_widthPetal_width等的五分位数,并将它们存储为嵌套小标题。

我实际上不是年份Species的年份的时间序列数据(因此我依赖这些年份),所以我实际上想计算该年中许多列的五分位数(而不是{{1 }}等),然后提取所有年份的Sepal.length的所有五分位数,将它们组合成所有年份的一个时间序列数据帧,然后基于五分位数将它们嵌套回去。

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

1)按“年份/(物种)”嵌套数据

2)计算许多列的五分位数

3)将所有五分位数等于1,然后2,然后3 ...等的数据取消嵌套,因此将所有年份/(物种)放回总共5个数据框中(或希望是新的嵌套小节)< / p>

4)按五分位数(现在包含所有年份/(物种)

)来收集数据

所以我将有一个由5个小块组成的嵌套小块(每个五分之一),其中每个小块都是由所有年份(物种)重新组合在一起组成的

数据:

1

预期的输出:-不是“完全”,而是或多或少地接近。

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

由于我复制并粘贴了该小标题并对其进行了一些修改,因此请忽略小标题的大小。

因此有5个小标题-每个分位数一个。 # 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]> sep_lensep_widpet_len由所有数据组成(对于所有种类),即在嵌套pet_wid的嵌套小对象之前,执行了五分法运算,然后使用类似这样的

Species

允许我为所有3个物种提取五分位数= 1。因此,这里的df1 <- iris_quintiles %>% unnest() %>% filter(quantile_Sep_len == 1)应该基本上是上述df1标题中的Sep_len。以下:

quintile_1

在同一小节中将df2 <- iris_quintiles %>% unnest() %>% filter(quantile_Sep_len == 2)设为sep_len

1 个答案:

答案 0 :(得分:2)

我们可以将'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)))