我正在使用dplyr的summarise_each将函数应用于多列数据。一件好事是你可以同时应用多个功能。事实上,令人讨厌的是输出是具有单行的数据帧。它似乎应该返回与函数一样多的行,列数与列总结的列数相同。
library(dplyr)
default <-
iris %>%
summarise_each(funs(min, max), matches("Petal"))
返回
> default
Petal.Length_min Petal.Width_min Petal.Length_max Petal.Width_max
1 1 0.1 6.9 2.5
我更喜欢像
这样的东西library(reshape2)
desired <-
iris %>%
select(matches("Petal")) %>%
melt() %>%
group_by(variable) %>%
summarize(min=min(value),max=max(value)) %>%
t()
返回一些接近的东西(不是数据帧,但你们都明白了)
> desired
[,1] [,2]
variable "Petal.Length" "Petal.Width"
min "1.0" "0.1"
max "6.9" "2.5"
在summarise_each中有一个选项可以执行此操作吗?如果没有,哈德利,你介意加入吗?
答案 0 :(得分:24)
您可以结合dplyr
和tidyr
包来实现类似的输出。
这些方面的东西可以帮助
library(dplyr)
library(tidyr)
iris %>%
select(matches("Petal")) %>%
summarise_each(funs(min, max)) %>%
gather(variable, value) %>%
separate(variable, c("var", "stat"), sep = "\\_") %>%
spread(var, value)
## stat Petal.Length Petal.Width
## 1 max 6.9 2.5
## 2 min 1.0 0.1
答案 1 :(得分:7)
据我所知,没有这样的论点。无论如何,这是一个输出整洁数据的解决方法,我认为这比使用尽可能多的行作为函数和列总结列更好。 (请注意add_rownames
需要dplyr 0.4.0)
library("dplyr")
library("tidyr")
iris %>%
summarise_each(funs(min, max, mean, median), matches("Petal")) %>%
t %>%
as.data.frame %>%
add_rownames %>%
separate(rowname, into = c("feature", "fun"), sep = "_")
返回:
feature fun V1
1 Petal.Length min 1.000000
2 Petal.Width min 0.100000
3 Petal.Length max 6.900000
4 Petal.Width max 2.500000
5 Petal.Length mean 3.758000
6 Petal.Width mean 1.199333
7 Petal.Length median 4.350000
8 Petal.Width median 1.300000
答案 2 :(得分:3)
一个选项是使用purrr::map_df
(真正的map_dfc
来简化回{。{}}的数据框架,尽管现在bind_cols
很好)每个函数的结果向量,即
map_df