将bind_rows与分位数列表一起使用时出错

时间:2018-03-08 13:09:43

标签: r dplyr

我在pull的输出中有一个分位数列表,列表的每个元素都是一个带有十进制位置的命名数字向量。

tibble(norm=rnorm(1e3, 100, 1000), group=sample(c("a", "b", "c", "d"), 1e3, TRUE)) %>% 
    group_by(group) %>% 
    summarise_at("norm", ~list(quantile(.x, seq(0,1,.1)))) %>% 
    pull(norm) %>%
    bind_rows()

但它会产生以下错误:

  

bind_rows_(x,.id)出错:参数1必须具有名称

我不知道为什么我会收到此错误,因为bind_rows似乎与类似的示例很好地协作。代码适用于rbind_list()

使用的dplyr版本是0.7.4

所需的输出:

# A tibble: 4 x 11
#   `0%` `10%` `20%` `30%` `40%` `50%` `60%` `70%` `80%` `90%` `100%`
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
#1  2.97  3.37  3.43  3.47  3.51  3.54  3.57  3.60  3.64  3.70   3.99
#2  2.88  3.21  3.30  3.35  3.40  3.44  3.48  3.52  3.57  3.64   3.84
#3  2.60  3.08  3.16  3.21  3.26  3.31  3.36  3.40  3.47  3.53   3.86
#4  2.13  2.60  2.67  2.73  2.79  2.87  2.93  2.99  3.08  3.20   3.41

2 个答案:

答案 0 :(得分:1)

使用dplyrpurrr,我们可以执行以下操作:

library(dplyr)
library(purrr)

df %>% 
  group_by(group) %>% 
  summarise_at("norm", ~list(quantile(.x, seq(0,1,.1)))) %>% 
  pull(norm) %>% 
  map_df(bind_rows)

返回:

# A tibble: 4 x 11
   `0%` `10%` `20%` `30%`  `40%`  `50%` `60%` `70%` `80%` `90%` `100%`
  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
1 -2834 -1228  -708  -473 -190     66.4   265   673  1011  1350   3123
2 -2971 - 889  -622  -330 - 69.6  120     417   657   936  1269   3126
3 -3368 -1207  -665  -356 -174     90.7   324   627   990  1426   2476
4 -3579 -1262  -769  -491 -227   - 17.8   211   508   831  1245   2806

数据:

df <- tibble(
  norm = rnorm(1e3, 100, 1000), 
  group = sample(c("a", "b", "c", "d"), 1e3, TRUE)
)

答案 1 :(得分:0)

这是处理工作的一种方法。使用bind_rows()时,您需要拥有数据框。因此,您希望根据norm中的summarise_at()列创建数据框。您可以使用每个数据框的rownames创建一个列。此信息是百分位数。然后,您使用bind_rows()。您清理列名称并替换Group中的值。我认为可能有一种更简洁的方式来完成这项工作。这就是我现在可以为你做的事情。

mytib <- tibble(norm = rnorm(1e3, 100, 1000), 
                group = sample(c("a", "b", "c", "d"), 1e3, TRUE))

group_by(mytib, group) %>% 
summarise_at("norm", ~list(quantile(.x, seq(0,1,.1)))) %>% 
pull(norm) %>%
lapply(as.data.frame) %>%
lapply(rownames_to_column) %>%
bind_rows(.id = "Group") %>%
setNames(c("Group", "Percentile", "Value")) %>%
mutate(Group = rep(sort(unique(mytib$group)), each = n() / n_distinct(Group)))

结果的一部分就是打击。

   Group Percentile       Value
1      a         0% -2969.41031
2      a        10% -1100.39816
3      a        20%  -622.69348
4      a        30%  -423.08332
5      a        40%  -140.71709
6      a        50%    72.34586
7      a        60%   318.77128
8      a        70%   574.75911
9      a        80%   853.70942
10     a        90%  1405.57527
11     a       100%  3254.30424
12     b         0% -2443.18790
13     b        10% -1221.17822
14     b        20%  -822.14883
15     b        30%  -536.71329
16     b        40%  -152.42027
17     b        50%    56.48301
18     b        60%   234.95982
19     b        70%   418.50382
20     b        80%   706.30857
21     b        90%  1248.54743
22     b       100%  3501.81753