将列表列分隔为R中的列

Cos*_*tin 4 r multiple-columns dplyr tidyr

给定一个数据帧2列,id并且value,我想它含有更多的列转换成一个数据帧id和从位数列value:q0,q25,q50,q75,q100.

我不知道如何将包含列表的列分成更多包含其值的列.当然,所有列表都具有相同的长度.

这是一个例子:

library(dplyr)
library(tidyr)

set.seed(0)
df <- data.frame(id = rep(c("Alice", "Bob"), each = 10),
                 value = round(rnorm(20) * 10))
> df
Run Code Online (Sandbox Code Playgroud)
      id value
1  Alice    13
2  Alice    -3
3  Alice    13
4  Alice    13
5  Alice     4
6  Alice   -15
7  Alice    -9
8  Alice    -3
9  Alice     0
10 Alice    24
11   Bob     8
12   Bob    -8
13   Bob   -11
14   Bob    -3
15   Bob    -3
16   Bob    -4
17   Bob     3
18   Bob    -9
19   Bob     4
20   Bob   -12
df_quantiles <- df %>% 
  group_by(id) %>% 
  summarise( quantiles = list(quantile(value))) %>% 
  ungroup()
> df_quantiles
Run Code Online (Sandbox Code Playgroud)
    # A tibble: 2 x 2
          id quantiles
          
    1  Alice 
    2    Bob 
> df_quantiles$quantiles
Run Code Online (Sandbox Code Playgroud)
[[1]]
  0%  25%  50%  75% 100% 
 -15   -3    2   13   24 

[[2]]
    0%    25%    50%    75%   100% 
-12.00  -8.75  -3.50   1.50   8.00 

下一个命令不起作用.你能帮我separate打电话好吗?有没有其他方法来获得结果?

> df_quantiles %>%
+ separate(quantiles, paste0("q", seq(0,5)))
# A tibble: 2 x 7
      id    q0    q1    q2    q3    q4    q5
*       
1  Alice     c    15     3     2    13    24
2    Bob     c    12     8    75     3     5
Warning message:
Too many values at 2 locations: 1, 2 

我期望的是这个数据帧:

    id      q0%    q25%    q50%    q75%   q100%
1  Alice    -15      -3       2      13      24
2    Bob -12.00   -8.75   -3.50    1.50    8.00
Run Code Online (Sandbox Code Playgroud)

San*_*Dey 5

怎么样

cbind.data.frame(id=unique(df$id), do.call(rbind, df_quantiles$quantiles))
Run Code Online (Sandbox Code Playgroud)

与输出

id  0%   25%  50%  75% 100%
1 Alice -15 -3.00  2.0 13.0   24
2   Bob -12 -8.75 -3.5  1.5    8
Run Code Online (Sandbox Code Playgroud)