2016-09-12 40 views
4

鑑於2列,idvalue一個數據幀的列,我想將它轉變成與含有id更多列的數據幀和從柱value的位數:q0q25q50q75q100單獨列表塔送入中的R

我不知道如何將包含列表的列分隔爲包含其值的更多列。當然,所有的名單都有相同的長度。

下面是一個例子:

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 
+2

只要試試'aggregate(df $ value,df [「id」],quantile)''。 – nicola

回答

2

如果你需要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 
2

我們可以使用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 
+1

'''比'as.list'快得多我喜歡dplyr解決方案:) – Costin

4

如何

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 
2

名單的組合,從tibble as_tibble as.list and unnest from tidyr did the job

library(tidyverse) 
df_quantiles <- df %>% 
    group_by(id) %>% 
    summarise(quantiles = list(as_tibble(as.list(quantile(value))))) %>% unnest() %>% 
    ungroup()