这是对先前问题here的质疑。我想进一步了解一下,但不确定如何。
我想做的是分别提取Sepal_width
,Petal_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_len
,sep_wid
和pet_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
。
答案 0 :(得分:2)
我们可以将'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)))