将列表列分隔为 R 中的列
separate list column into columns in R
给定一个包含 2 列的数据框,id
和 value
,我想将其转换为包含更多列的数据框,其中包含 id
和 [= 列中的分位数15=]: 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 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
# A tibble: 2 x 2
id quantiles
1 Alice
2 Bob
> df_quantiles$quantiles
[[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
我们可以使用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
解决方案,您可以像这样使用它:
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
来自 tibble 的列表 as_tibble,来自 tidyr 的 as.list 和 unnest 的组合完成了工作
library(tidyverse)
df_quantiles <- df %>%
group_by(id) %>%
summarise(quantiles = list(as_tibble(as.list(quantile(value))))) %>% unnest() %>%
ungroup()
给定一个包含 2 列的数据框,id
和 value
,我想将其转换为包含更多列的数据框,其中包含 id
和 [= 列中的分位数15=]: 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 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
# A tibble: 2 x 2 id quantiles 1 Alice 2 Bob
> df_quantiles$quantiles
[[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
我们可以使用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
解决方案,您可以像这样使用它:
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
来自 tibble 的列表 as_tibble,来自 tidyr 的 as.list 和 unnest 的组合完成了工作
library(tidyverse)
df_quantiles <- df %>%
group_by(id) %>%
summarise(quantiles = list(as_tibble(as.list(quantile(value))))) %>% unnest() %>%
ungroup()