首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用purrr::map和forcats::fct_reorder对每个子组的因子水平进行排序

使用purrr::map和forcats::fct_reorder对每个子组的因子水平进行排序
EN

Stack Overflow用户
提问于 2017-06-07 22:22:23
回答 1查看 887关注 0票数 0

我试图根据第三个变量重新排序该变量的每个子组中变量的因子级别,但我得到了一个错误。

我认识到没有上下文就很难理解这一点,所以我使用gapminder数据集来说明。在这里,我希望根据country变量的大小重新排序continent变量的每个类别中的pop变量的因子级别:

代码语言:javascript
复制
library(gapminder)
library(tidyverse)
library(forcats)

gapminder %>% 
    filter(year == 2007) %>% 
    group_by(continent) %>% 
    nest() %>% 
    mutate(newdata = map(data, fct_reorder, country, pop)) %>% 
    unnest(newdata)

Mutate_impl中的错误(.data,dots):f必须是一个因子(或字符向量)。

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2017-06-07 23:12:41

我现在并不是真正的forcats和它的fct_*函数,我四处搜寻,没有找到一种方法来完成您想要的。然而,我们可以通过以下方式获得:

代码语言:javascript
复制
library(gapminder)
library(tidyverse)

gapminder %>% 
  filter(year == 2007) %>% 
  group_by(continent) %>% 
  nest() %>% 
  mutate(newdata = map(data, ~{
    .x$country <- reorder(.x$country, order(.x$pop, decreasing = TRUE))
    .x
    })
  ) -> res
res
#> # A tibble: 5 × 3
#>   continent              data           newdata
#>      <fctr>            <list>            <list>
#> 1      Asia <tibble [33 × 5]> <tibble [33 × 5]>
#> 2    Europe <tibble [30 × 5]> <tibble [30 × 5]>
#> 3    Africa <tibble [52 × 5]> <tibble [52 × 5]>
#> 4  Americas <tibble [25 × 5]> <tibble [25 × 5]>
#> 5   Oceania  <tibble [2 × 5]>  <tibble [2 × 5]>

我们可以验证因素级别确实发生了变化:

代码语言:javascript
复制
lapply(res$newdata, function(x) as.numeric(x$country))
#> [[1]]
#>  [1]  5  7  8 23  3 12 24 31  9 30 15 20  1 21 25 10 18 14 29 33 27 28  4
#> [24]  6 11 13 26 32 17 22 19 16  2
#> 
#> [[2]]
#>  [1] 11 29 10 30 16 26 20 22 18 12 21  3  7 23 13 27  2 28  5  8 24  9 19
#> [24]  4  6 15  1 25 17 14
#> 
#> [[3]]
#>  [1] 37 15 18 11 44 45 47 24 33  1 50 21 34 28 13  7  5 29 36  2 52 41 30
#> [24] 51 49  9 22 43 39  6  3 42 27 48 17  8 12 31 26 35 25 20  4 23 19 32
#> [47] 46 38 10 16 14 40
#> 
#> [[4]]
#>  [1] 23  3 16  6  1  4 20 25  5 10 12  8  9  2 13 14 11 19 17  7 21 24 18
#> [24] 15 22
#> 
#> [[5]]
#> [1] 1 2

在此之后,您就不能真正地unnest它了,因为每个continent的国家因素‘列表’都会与其他元素发生冲突:

代码语言:javascript
复制
res %>% 
  select(-data) %>% 
  unnest() -> res2
sapply(res2$country, as.numeric)
#>   [1]   5   7   8  23   3  12  24  31   9  30  15  20   1  21  25  10  18
#>  [18]  14  29  33  27  28   4   6  11  13  26  32  17  22  19  16   2  34
#>  [35]  39  40  43  46  60  62  63  72  73  76  78  84  85  86  87  99 103
#>  [52] 108 112 113 116 120 122 123 126 129 130 135 137  35  36  41  44  47
#>  [69]  48  49  51  52  55  56  57  59  64  67  69  70  71  74  75  77  80
#>  [86]  81  89  90  91  92  93  94  95  96  97 100 101 102 106 107 115 117
#> [103] 118 119 121 124 125 127 128 131 132 134 136 141 142  37  42  45  50
#> [120]  53  54  58  61  65  66  68  79  82  83  88  98 105 109 110 111 114
#> [137] 133 138 139 140  38 104

我想他们又被按顺序重新排序了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44423712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档