gpt4 book ai didi

R:在使用基础 R 添加新计数列的同时聚合数据

转载 作者:行者123 更新时间:2023-12-04 10:52:27 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Apply several summary functions on several variables by group in one call

(7 个回答)


上个月关闭。




我想聚合一个数据框,同时添加一个新列 (N),该列在基数 R 中计算分组变量的每个值的行数。

这在 dplyr 中是微不足道的:

library(dplyr)
data(iris)

combined_summary <- iris %>% group_by(Species) %>% group_by(N=n(), add=TRUE) %>% summarize_all(mean)

> combined_summary
# A tibble: 3 x 6
# Groups: Species [3]
Species N Sepal.Length Sepal.Width Petal.Length Petal.Width
<fct> <int> <dbl> <dbl> <dbl> <dbl>
1 setosa 50 5.01 3.43 1.46 0.246
2 versicolor 50 5.94 2.77 4.26 1.33
3 virginica 50 6.59 2.97 5.55 2.03

然而,不幸的是,我不得不在不允许使用包的环境中编写此代码(不要问;这不是我的决定)。所以我需要一种在基础 R 中做到这一点的方法。

我可以在基础 R 中以冗长的方式进行,如下所示:
# First create the aggregated tables separately
summary_means <- aggregate(. ~ Species, data=iris, FUN=mean)
summary_count <- aggregate(Sepal.Length ~ Species, data=iris[, c("Species", "Sepal.Length")], FUN=length)

> summary_means
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026

> summary_count
Species Sepal.Length
1 setosa 50
2 versicolor 50
3 virginica 50

# Then rename the count column
colnames(summary_count)[2] <- "N"

> summary_count
Species N
1 setosa 50
2 versicolor 50
3 virginica 50

# Finally merge the two dataframes
combined_summary_baseR <- merge(x=summary_count, y=summary_means, by="Species", all.x=TRUE)

> combined_summary_baseR
Species N Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 50 5.006 3.428 1.462 0.246
2 versicolor 50 5.936 2.770 4.260 1.326
3 virginica 50 6.588 2.974 5.552 2.026


有没有办法在基础 R 中以更有效的方式做到这一点?

最佳答案

这是使用单个 by 的基本 R 选项调用(聚合)

do.call(rbind, by(
iris[-ncol(iris)], iris[ncol(iris)], function(x) c(N = nrow(x), colMeans(x))))
# N Sepal.Length Sepal.Width Petal.Length Petal.Width
#setosa 50 5.006 3.428 1.462 0.246
#versicolor 50 5.936 2.770 4.260 1.326
#virginica 50 6.588 2.974 5.552 2.026

使用 colMeans确保列名被传递以避免额外的 setNames称呼。

更新

为了回应您的评论,将行名称作为单独的列需要一个额外的步骤。
d <- do.call(rbind, by(
iris[-ncol(iris)], iris[ncol(iris)], function(x) c(N = nrow(x), colMeans(x))))
cbind(Species = rownames(d), as.data.frame(d))

不如最初的 by简洁称呼。我认为我们在这里发生了哲学冲突。在 dplyr (和 tidyverse )行名称通常被避免,以符合“整理数据”的原则。在基本 R 中,行名称很常见,并且(或多或少)一致地通过数据操作进行。所以在某种程度上,您要求混合使用 dplyr (tidy) 和基本的 R 数据结构概念,这可能不是最佳/稳健的方法。

关于R:在使用基础 R 添加新计数列的同时聚合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59418431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com