同时导出 dplyr 中分组值的唯一值和汇总值计数的有效方法
Efficient way of simultaneously deriving count of unique values and summary values for grouped values in dplyr
我有兴趣找到一种有效的方式来获取 按组 table 的摘要,其中将包含:
- 计算每组的唯一值
- 选定变量的一组原始描述性统计数据
例如,在生成描述性统计信息的情况下,我使用以下代码:
data("mtcars")
require(dplyr)
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp)
这将生成所需的输出:
> head(mt_sum)
Source: local data frame [3 x 7]
cyl hp_min wt_min disp_min hp_max wt_max disp_max
(dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1 4 52 1.513 71.1 113 3.190 146.7
2 6 105 2.620 145.0 175 3.460 258.0
3 8 150 3.170 275.8 335 5.424 472.0
我有兴趣用能够反映每个组的值计数的图形来丰富数据。关于计数,可以简单地做到这一点:
mt_sum2 <- mtcars %>%
group_by(cyl) %>%
summarise(countObs = n())
这将生成所需的数据:
> head(mt_sum2)
Source: local data frame [3 x 2]
cyl countObs
(dbl) (int)
1 4 11
2 6 7
3 8 14
问题
当我想同时应用两个转换时出现问题。
尝试 1
例如代码:
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
summarise(countObs = n())
会生成:
Source: local data frame [3 x 2]
cyl countObs
(dbl) (int)
1 4 11
2 6 7
3 8 14
没有之前生成的描述性统计数据。
尝试 2
代码:
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max,n), hp, wt, disp)
预计会失败:
Error: n does not take arguments
尝试 3(有效)
代码:
data("mtcars")
require(dplyr)
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
left_join(y = data.frame(
"Var1" = as.numeric(as.character(as.data.frame(table(mtcars$cyl))$Var1)),
"Count" = as.character(as.data.frame(table(mtcars$cyl))$Freq)),
by = c("cyl" = "Var1"))
将提供所需数据:
> head(mt_sum)
Source: local data frame [3 x 8]
cyl hp_min wt_min disp_min hp_max wt_max disp_max Count
(dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (fctr)
1 4 52 1.513 71.1 113 3.190 146.7 11
2 6 105 2.620 145.0 175 3.460 258.0 7
3 8 150 3.170 275.8 335 5.424 472.0 14
我认为这是生成此摘要的一种极其低效的方式。特别是,在处理大型 table 时,动态创建对象 效率低下。我有兴趣以更有效的方式实现相同的结果,而不涉及仅为了合并目的而创建对象。特别是,我想在 dplyr
中做的事情对应于从 table 的先前版本中导出额外的摘要。例如:
- 组
- 生成描述性统计数据
- 返回组后的数据
- 生成一些额外的统计数据并添加到最终数据中
这是使用 left_join
的另一个(较短的)选项:
mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
left_join(count(mtcars, cyl))
#Joining by: "cyl"
#Source: local data frame [3 x 8]
#
# cyl hp_min wt_min disp_min hp_max wt_max disp_max n
# (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (int)
#1 4 52 1.513 71.1 113 3.190 146.7 11
#2 6 105 2.620 145.0 175 3.460 258.0 7
#3 8 150 3.170 275.8 335 5.424 472.0 14
我有兴趣找到一种有效的方式来获取 按组 table 的摘要,其中将包含:
- 计算每组的唯一值
- 选定变量的一组原始描述性统计数据
例如,在生成描述性统计信息的情况下,我使用以下代码:
data("mtcars")
require(dplyr)
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp)
这将生成所需的输出:
> head(mt_sum)
Source: local data frame [3 x 7]
cyl hp_min wt_min disp_min hp_max wt_max disp_max
(dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1 4 52 1.513 71.1 113 3.190 146.7
2 6 105 2.620 145.0 175 3.460 258.0
3 8 150 3.170 275.8 335 5.424 472.0
我有兴趣用能够反映每个组的值计数的图形来丰富数据。关于计数,可以简单地做到这一点:
mt_sum2 <- mtcars %>%
group_by(cyl) %>%
summarise(countObs = n())
这将生成所需的数据:
> head(mt_sum2)
Source: local data frame [3 x 2]
cyl countObs
(dbl) (int)
1 4 11
2 6 7
3 8 14
问题
当我想同时应用两个转换时出现问题。
尝试 1
例如代码:
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
summarise(countObs = n())
会生成:
Source: local data frame [3 x 2]
cyl countObs
(dbl) (int)
1 4 11
2 6 7
3 8 14
没有之前生成的描述性统计数据。
尝试 2
代码:
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max,n), hp, wt, disp)
预计会失败:
Error: n does not take arguments
尝试 3(有效)
代码:
data("mtcars")
require(dplyr)
mt_sum <- mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
left_join(y = data.frame(
"Var1" = as.numeric(as.character(as.data.frame(table(mtcars$cyl))$Var1)),
"Count" = as.character(as.data.frame(table(mtcars$cyl))$Freq)),
by = c("cyl" = "Var1"))
将提供所需数据:
> head(mt_sum)
Source: local data frame [3 x 8]
cyl hp_min wt_min disp_min hp_max wt_max disp_max Count
(dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (fctr)
1 4 52 1.513 71.1 113 3.190 146.7 11
2 6 105 2.620 145.0 175 3.460 258.0 7
3 8 150 3.170 275.8 335 5.424 472.0 14
我认为这是生成此摘要的一种极其低效的方式。特别是,在处理大型 table 时,动态创建对象 效率低下。我有兴趣以更有效的方式实现相同的结果,而不涉及仅为了合并目的而创建对象。特别是,我想在 dplyr
中做的事情对应于从 table 的先前版本中导出额外的摘要。例如:
- 组
- 生成描述性统计数据
- 返回组后的数据
- 生成一些额外的统计数据并添加到最终数据中
这是使用 left_join
的另一个(较短的)选项:
mtcars %>%
group_by(cyl) %>%
summarise_each(funs(min,max), hp, wt, disp) %>%
left_join(count(mtcars, cyl))
#Joining by: "cyl"
#Source: local data frame [3 x 8]
#
# cyl hp_min wt_min disp_min hp_max wt_max disp_max n
# (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (int)
#1 4 52 1.513 71.1 113 3.190 146.7 11
#2 6 105 2.620 145.0 175 3.460 258.0 7
#3 8 150 3.170 275.8 335 5.424 472.0 14