【问题标题】:nesting tibbles, perform operation, unnest and nest data in a different form嵌套小标题,执行操作,以不同的形式取消嵌套和嵌套数据
【发布时间】: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 each Species` 我将得到五分位数提到的 4 个变量中的每一个。然后我想将Petal.length == 1 的数据与所有 3 个Species 结合到一个数据框中。对所有 5 个五分位数执行此操作。然后根据这些五分位数将数据重新嵌套在一起。
  • @user113156 是您期望输出的最后一个代码块
  • 我现在去看看!
  • 我在原始问题中添加了“预期输出”部分。

标签: r


【解决方案1】:

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

【讨论】:

  • 谢谢!这看起来正是我想要的。我会将它应用到我的实际数据中,并让你知道它是如何进行的,但它看起来是正确的。一个问题,为什么你认为quintiles的计算是错误的?
  • @user113156 我没有看计算,所以我只是想确保部分正确并专注于预期的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多