我在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
答案 0 :(得分:1)
使用dplyr
和purrr
,我们可以执行以下操作:
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