gpt4 book ai didi

r - 如何计算具有相同列名的数据框中这些列的平均值

转载 作者:行者123 更新时间:2023-12-05 01:29:41 32 4
gpt4 key购买 nike

我有一个由 66 个变量的 10299 个观察值组成的数据框。其中一些变量共享一个共同的列名,我想为每个观察计算这些变量的平均值。

具有以下矩阵,列名 c(A, B, C, B, A ,C) :

A B C B A C                             
1 2 3 4 5 6
3 5 6 7 4 3
3 3 3 3 5 5
2 2 2 2 2 2

我想得到:
A   B   C    
3 3 4.5
3.5 6 4.5
4 3 4
2 2 2

我试过for循环,命令 aggregate()但我没有得到想要的结果。

对不起,如果这个问题看起来太简单了,我已经检查了谷歌可能的解决方案,但我没有找到任何解决方案。

最佳答案

这是一个解决方案。

首先让我们定义一个示例性 data.frame (与您的示例相同)。

df <- as.data.frame(
matrix(c(1,3,3,2,2,5,3,2,3,6,3,2,4,7,3,2,5,4,5,2,6,3,5,2),
ncol=6,
dimnames=list(NULL, c("A", "B", "C", "B", "A", "C"))
)
)

下面我们对每个唯一的列名称应用自定义函数 col :
它选择所有名为 col 的列并计算 rowMeans .结果,原子向量列表,将被强制转换为 data.frame:
res <- as.data.frame( # sapply returns a list here, so we convert it to a data.frame
sapply(unique(names(df)), # for each unique column name
function(col) rowMeans(df[names(df) == col]) # calculate row means
)
)

结果:
res
## A B C
## 1 3.0 3 4.5
## 2 3.5 6 4.5
## 3 4.0 3 4.0
## 4 2.0 2 2.0

编辑:
由于已经提出了许多解决方案,让我们对它们进行基准测试:
set.seed(123)
df <- as.data.frame(matrix(sample(1:9, replace=TRUE, 10000*100),
dimnames=list(NULL, sample(LETTERS[1:5], 100, replace=TRUE)), ncol=100))
library(microbenchmark)
microbenchmark(...)
## Unit: milliseconds
## min lq median uq max neval
## @gagolews 61.196075 65.73211 77.22533 119.42028 127.32557 10
## @joran 8.297964 10.05242 10.90564 15.25943 65.69156 10
## @Davide 5535.272680 5731.24220 5754.67006 5808.47807 5862.22628 10

明显的赢家(至少就速度而言)是@joran 的 lapply + split + Reduce .恭喜! :-)

关于r - 如何计算具有相同列名的数据框中这些列的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23815727/

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