嵌套的 tibbles 函数未提供预期的输出

  • 本文关键字:输出 tibbles 函数 嵌套 r
  • 更新时间 :
  • 英文 :


我有一些类似于下面iris数据集的数据。我正在尝试根据两列(group_by(Species, years)(嵌套数据。我把数据放到一个名为 data 的 tibble 中。看起来像:

# A tibble: 15 x 3
   Species    years data             
   <fct>      <int> <list>           
 1 setosa         1 <tibble [10 x 4]>
 2 setosa         5 <tibble [10 x 4]>
 3 setosa         3 <tibble [10 x 4]>
 4 setosa         4 <tibble [10 x 4]>
 5 setosa         2 <tibble [10 x 4]>

我正在尝试计算每个 tibble 的分位数。因此,计算Species == virginicayears == 1并计算Sepal.Length的分位数,但是由于我选择了data(它由整个数据组成,而不是过滤数据或嵌套数据(,因此我在部分virginica_Q = map(data, ~select(.x, Sepal.Length, Sepal.Width))某处出错了。

这段代码给了我想要的输出:

iris %>%
  filter(Species == "virginica") %>%
  filter(years == 1) %>%
  mutate(Q_vir_sep_len = ntile(Sepal.Length, 4))

我现在有Sepal.Length的分位数:

  Sepal.Length Sepal.Width Petal.Length Petal.Width   Species years Q_vir_sep_len
1           6.3         3.3          6.0         2.5 virginica     1             1
2           7.6         3.0          6.6         2.1 virginica     1             4
3           6.5         3.2          5.1         2.0 virginica     1             1
4           6.4         3.2          5.3         2.3 virginica     1             1
5           6.9         3.2          5.7         2.3 virginica     1             3
6           7.2         3.2          6.0         1.8 virginica     1             3
7           7.4         2.8          6.1         1.9 virginica     1             3
8           7.7         3.0          6.1         2.3 virginica     1             4
9           6.7         3.1          5.6         2.4 virginica     1             2
10          6.7         3.0          5.2         2.3 virginica     1             2

我只想在所有nested_tibbles中复制它

数据/代码

data(iris)
iris$years <- floor(runif(nrow(iris), min=0, max=5)) # edited the years column
iris
nested_iris <- iris %>%
  group_by(Species, years) %>%
  nest(.key = "data") %>%
    mutate(
      virginica_Q = map(data, ~select(.x, Sepal.Length, Sepal.Width)) %>%
        map(., ~mutate(.x, Q_vir_sep_len = ntile(Sepal.Length, 4))),
      Setosa_Q = map(data, ~select(.x, Sepal.Length, Sepal.Width)) %>%
        map(., ~mutate(.x, Q_set_sep_len = ntile(Sepal.Length, 4)))
      )

nested_iris

我认为对我来说的解决方案就像

nested_iris <- iris %>%
      group_by(Species, years) %>%
      nest(.key = "data") %>%
        mutate(
          ALL_QUANTILES = map(data, ~select(.x, Sepal.Length, Sepal.Width)) %>%
            map(., ~mutate(.x, myQuantiles = ntile(Sepal.Length, 4))),
          )

而且我不需要为每个分位数创建不同的 tibble...

如果你想修改嵌套的tibbles,那么这应该可以:

nested_iris <- iris %>% 
  group_by(Species, years) %>% 
  nest(.key = "data") %>% 
  mutate(data = map(data, function(df) {
    mutate(df, Sepal.Length.Q4 = ntile(Sepal.Length, 4))
  }))
# then looking in the first nested tibble:
nested_iris$data[[1]]
# A tibble: 10 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length.Q4
          <dbl>       <dbl>        <dbl>       <dbl>           <int>
 1          5.1         3.5          1.4         0.2               3
 2          5.4         3.9          1.7         0.4               3
 3          5.4         3.7          1.5         0.2               3
 4          5.7         4.4          1.5         0.4               4
 5          5.4         3.4          1.7         0.2               4
 6          5           3            1.6         0.2               1
 7          4.8         3.1          1.6         0.2               1
 8          5           3.2          1.2         0.2               2
 9          5           3.5          1.3         0.3               2
10          4.8         3            1.4         0.3               1

然后,您可以在内部mutate中定义所需的任何新列。

最新更新