【发布时间】:2019-05-04 18:57:29
【问题描述】:
这是对先前问题here 的后续问题。我想更进一步,但不确定如何。
我想要做的是提取每个Sepal_width、Petal_width 等的五分位数并将它们存储为嵌套的小标题。
而不是Species,我实际上有年份的时间序列数据(所以我嵌套在这些年份上),所以我实际上想计算那一年中许多列的五分位数(而不是Sepal.length 等。 ),然后将1的所有年份的所有五分位数拉出,将它们组合成一个所有年份的时间序列数据框,然后根据五分位数将它们嵌套回去。
我知道标题可能有点混乱,所以我想做的是:
1) 按“年/(种)”嵌套数据
2) 计算多列的五分位数
3) 将所有五分位数等于 1、然后 2、然后 3... 的数据取消嵌套,因此所有年份/(物种)都被放回总共 5 个数据帧中(或者希望是新的嵌套 tibbles)
4) 按五分位数重新排列数据(现在包含所有年份/(物种)
所以我将有一个包含 5 个 tibble 的嵌套 tibble(每五分之一一个),其中每个 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 的大小,因为我复制并粘贴了此 tibble 并对其进行了一些修改。
所以有 5 个小数 - 每个分位数一个。 sep_len、sep_wid、pet_len 和 pet_wid 包含所有数据(适用于所有物种) - 即在嵌套在 Species 上的嵌套 tibble 之前 - 执行五分位数操作,然后使用类似的东西
df1 <- iris_quintiles %>%
unnest() %>%
filter(quantile_Sep_len == 1)
允许我提取所有 3 个物种的五分位数 = 1。所以这里df1基本上应该是Sep_len上面的tibble中的quintile_1。以下:
df2 <- iris_quintiles %>%
unnest() %>%
filter(quantile_Sep_len == 2)
在同一个 tibble 中,quintile_2 将是 sep_len。
【问题讨论】:
-
对不起,我真的不明白。我认为如果你从你想要的结果而不是你认为应该使用的过程开始,它可能会更简单。意思是告诉我们你想要什么,而不是你认为你想要的代码的最后一步。
-
我完全理解这有点令人困惑!使用 Sepal 数据示例。我想通过
Species嵌套数据,然后对每个Sepal.length执行五分位数运算,p Sepal.width,Petal.length,Petal.width. So for eachSpecies` 我将得到五分位数提到的 4 个变量中的每一个。然后我想将Petal.length == 1的数据与所有 3 个Species结合到一个数据框中。对所有 5 个五分位数执行此操作。然后根据这些五分位数将数据重新嵌套在一起。 -
@user113156 是您期望输出的最后一个代码块
-
我现在去看看!
-
我在原始问题中添加了“预期输出”部分。
标签: r