首页 > 解决方案 > R:如何在原始df中按单列分组n个数据框?

问题描述

我有一个具有“值”的数据框,然后是 Decile_Category_1、Decile_Category_2、...、Decile_Category_n。

我想将 n 个单独的 df 按它们的十分位数分组,然后想在每个数据透视表上制作一个图表。除了 n 次键入 group_by 之外,还有什么快速的方法?

编辑:示例开始 DF:

Value  Dec_Cat_1    Dec_Cat_2   Dec_Cat_3
100    1            3             1      
200    3            3             3
400    1            6             3 
...    ...          ...          ...

结束 DF1

Dec_Cat_1   Value
1           500
2           xxx
3           200
4           xxx
5           xxx          
6           xxx
7           xxx
8           xxx
9           xxx
10          xxx

结束 DF2

Dec_Cat_2   Value
1           xxx
2           xxx
3           300
4           xxx
5           xxx          
6           400
7           xxx
8           xxx
9           xxx
10          xxx

对于原始数据框中的每一列,依此类推。

标签: rloopslapply

解决方案


## Dataset
df = read.table(text="Value  Dec_Cat_1    Dec_Cat_2   Dec_Cat_3
100    1            3             1      
200    3            3             3
400    1            6             3", h=T)

如果您正在处理多个数据框,您可能希望将它们放在一个列表中。首先,将您的 n 列数据框分成包含 n-1 个数据框的列表:

l1 = lapply(df[-1],function(x) cbind(df[1],x))
$Dec_Cat_1
  Value x
1   100 1
2   200 3
3   400 1

$Dec_Cat_2
  Value x
1   100 3
2   200 3
3   400 6

$Dec_Cat_3
  Value x
1   100 1
2   200 3
3   400 3

然后,使用 和 中的函数dplyrtidyr您可以总结您的价值:

library(dplyr)
library(tidyr)
res = lapply(l1,function(d) d %>% group_by(x) %>% summarise(Value = sum(Value)) %>% complete(x = 1:10))
> res
$Dec_Cat_1
# A tibble: 10 x 2
       x Value
   <int> <int>
 1     1   500
 2     2    NA
 3     3   200
 4     4    NA
 5     5    NA
 6     6    NA
 7     7    NA
 8     8    NA
 9     9    NA
10    10    NA

$Dec_Cat_2
# A tibble: 10 x 2
       x Value
   <int> <int>
 1     1    NA
 2     2    NA
 3     3   300
 4     4    NA
 5     5    NA
 6     6   400
 7     7    NA
 8     8    NA
 9     9    NA
10    10    NA

$Dec_Cat_3
# A tibble: 10 x 2
       x Value
   <int> <int>
 1     1   100
 2     2    NA
 3     3   600
 4     4    NA
 5     5    NA
 6     6    NA
 7     7    NA
 8     8    NA
 9     9    NA
10    10    NA

推荐阅读