在R中将列表列分隔为列

在R中将列表列分隔为列,r,dplyr,multiple-columns,tidyr,R,Dplyr,Multiple Columns,Tidyr,给定一个包含两列的数据框,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), va

给定一个包含两列的数据框,
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
我期望的是这个数据帧:

    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

我们可以使用
data.table

library(data.table)
setDT(df)[, as.list(quantile(value)) , by =  id]
#      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

或者使用
dplyr

library(dplyr)
df %>%
   group_by(id) %>% 
   do(data.frame(as.list(quantile(.$value))))
#     id   X0.  X25.  X50.  X75. X100.
#  <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  Alice   -15 -3.00   2.0  13.0    24
#2    Bob   -12 -8.75  -3.5   1.5     8
库(dplyr)
df%>%
分组依据(id)%>%
do(数据帧(作为列表(分位数(.$value)))
#id X0。X25。X50。X75。X100。
#       
#1 Alice-15-3.00 2.0 13.0 24
#2鲍勃-12-8.75-3.51.58

如果您需要
dplyr
解决方案,您可以像这样使用它:

library(dplyr)
df %>% 
  group_by(id) %>%
  do(data.frame(t(quantile(.$value))))

#     id   X0.  X25.  X50.  X75. X100.
#   <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  Alice   -15 -3.00   2.0  13.0    24
#2    Bob   -12 -8.75  -3.5   1.5     8
库(dplyr)
df%>%
分组依据(id)%>%
do(数据帧(t(分位数(.$value)))
#id X0。X25。X50。X75。X100。
#        
#1 Alice-15-3.00 2.0 13.0 24
#2鲍勃-12-8.75-3.51.58
怎么样

cbind.data.frame(id=unique(df$id), do.call(rbind, df_quantiles$quantiles))
有输出

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

列表、as_tible from tibble、as.list和unnest from tidyr的组合完成了这项工作

library(tidyverse)
df_quantiles <- df %>% 
  group_by(id) %>% 
  summarise(quantiles = list(as_tibble(as.list(quantile(value))))) %>% unnest() %>%
  ungroup()
库(tidyverse)
df_分位数%
分组依据(id)%>%
总结(分位数=列表(可编辑的)(分位数(值‘‘‘‘)’)%%>%unnest()%%>%
解组()

只需尝试
聚合(df$value,df[“id”],分位数)
t
明显快于
as.list
我喜欢dplyr解决方案:)
library(data.table)
setDT(df)[, as.list(quantile(value)) , by =  id]
#      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
library(dplyr)
df %>%
   group_by(id) %>% 
   do(data.frame(as.list(quantile(.$value))))
#     id   X0.  X25.  X50.  X75. X100.
#  <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  Alice   -15 -3.00   2.0  13.0    24
#2    Bob   -12 -8.75  -3.5   1.5     8
library(dplyr)
df %>% 
  group_by(id) %>%
  do(data.frame(t(quantile(.$value))))

#     id   X0.  X25.  X50.  X75. X100.
#   <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  Alice   -15 -3.00   2.0  13.0    24
#2    Bob   -12 -8.75  -3.5   1.5     8
cbind.data.frame(id=unique(df$id), do.call(rbind, df_quantiles$quantiles))
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
library(tidyverse)
df_quantiles <- df %>% 
  group_by(id) %>% 
  summarise(quantiles = list(as_tibble(as.list(quantile(value))))) %>% unnest() %>%
  ungroup()