如何解决使用dplyr管道将统计信息如最小值或最大值从列返回行
我的问题与此类似:R dplyr rowwise mean or min and other methods?
想知道是否有任何dplyr函数(或诸如pivot_
之类的函数组合),可能会在通常的 dplyr单衬里中提供所需的输出?>
library(tidyverse); set.seed(1);
#Sample Data:
sampleData <- data.frame(O = seq(1,9,by = .1),A = rnorm(81),U = sample(1:81,81),I = rlnorm(81),R = sample(c(1,81,replace = T)); #sampleData;
#NormalOuput:
NormalOuput <- sampleData %>% summarise_all(list(min = min,max = max));
NormalOuput;
#> O_min A_min U_min I_min R_min O_max A_max U_max I_max R_max
#> 1 1 -2.2147 1 0.1970368 1 9 2.401618 81 14.27712 81
#Expected output:
ExpectedOuput <- data.frame(stats = c('min','max'),O = c(1,9),A = c(-2.2147,2.401618),U = c(1,I = c(0.1970368,14.27712),R = c(1,81));
ExpectedOuput;
#> stats O A U I R
#> 1 min 1 -2.214700 1 0.1970368 1
#> 2 max 9 2.401618 81 14.2771200 81
由reprex package(v0.3.0)于2020-08-26创建
注意:
在实际情况下,列数可能很大,因此名称不能直接调用。
编辑
充其量,我明白了:
sampleData %>% summarise(across(everything(),list(min = min,max = max))) %>%
t() %>% data.frame(Value = .) %>% tibble::rownames_to_column('Variables')
Variables Value
1 O_min 1.0000000
2 O_max 9.0000000
3 A_min -2.2146999
4 A_max 2.4016178
5 U_min 1.0000000
6 U_max 81.0000000
7 I_min 0.1970368
8 I_max 14.2771167
9 R_min 1.0000000
10 R_max 81.0000000
解决方法
我建议像下面这样混合使用tidyverse
函数。您必须重塑数据,然后与所需的汇总函数进行汇总,然后作为策略,您可以重新格式化并获得预期的输出:
library(tidyverse)
sampleData %>% pivot_longer(cols = names(sampleData)) %>%
group_by(name) %>% summarise(Min=min(value,na.rm=T),Max=max(value,na.rm=T)) %>%
rename(var=name) %>%
pivot_longer(cols = -var) %>%
pivot_wider(names_from = var,values_from=value)
输出:
# A tibble: 2 x 6
name A I O R U
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Min -2.21 0.197 1 1 1
2 Max 2.40 14.3 9 81 81
,
您可以使用新的across()
来消除Duck的一个枢轴:
sampleData %>%
summarise(across(everything(),list(min = min,max = max))) %>%
pivot_longer(
cols = everything(),names_to = c("var","stat"),names_sep = "_"
) %>%
pivot_wider(id_cols = "stat",names_from = "var")
# # A tibble: 2 x 6
# stat O A U I R
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 min 1 -2.21 1 0.197 1
# 2 max 9 2.40 81 14.3 81
但是最好的可能是马库斯在评论中的建议,我已经在这里进行了修改:
map_dfr(sampleData,function(x) c(min(x),max(x))) %>%
mutate(stat = c("min","max"))
# # A tibble: 2 x 6
# O A U I R stat
# <dbl> <dbl> <int> <dbl> <dbl> <chr>
# 1 1 -2.21 1 0.197 1 min
# 2 9 2.40 81 14.3 81 max
,
在玩pivot_longer
时,我发现这种两步走的单行代码也可以工作(基于@Gregor Thomas的答案,这里只有一个pivot_
而不是两个或更多):
sampleData %>%
summarise(across(everything(),list(min,max))) %>%
pivot_longer(everything(),names_to = c(".value","stats"),names_sep = "_")
# A tibble: 2 x 6
stats O A U I R
<chr> <dbl> <dbl> <int> <dbl> <dbl>
1 1 1 -2.21 1 0.197 1
2 2 9 2.40 81 14.3 81
更多内容:https://tidyr.tidyverse.org/reference/pivot_longer.html#examples
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。