当前位置: 首页 > 知识库问答 >
问题:

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

鲁明知
2023-03-14

我有一个由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

我尝试了循环,命令聚合(),但没有得到所需的结果。

抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案

共有3个答案

颜修明
2023-03-14

在我看来,这是可行的,但不如gegolews解决方案好:

x <- read.table(text = "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",header = TRUE,sep = "",check.names = FALSE)

as.data.frame(lapply(split(as.list(x),f = colnames(x)),function(x) Reduce(`+`,x) / length(x)))
##    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
席俊
2023-03-14

使用涂抹涂抹的组合:

t(apply(df, 1, function(x) tapply(x, colnames(df), mean)))

#        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
汪鸿志
2023-03-14

这是一个解决方案。

首先,让我们定义一个示例性的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的列,并计算行均值。结果原子向量列表将被强制为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的< code > lapply < code > split < code > Reduce 。恭喜你。:-)

 类似资料:
  • 我有三个数据帧,并试图计算由数据帧1调节的两个数据帧(Df2和Df3)之间的差值。如下面的示例所解释的,我有三个数据帧,Df1、Df2和Df3,它们具有共同的名称。第一步,在Df1中,我想比较“Standard”列和所有三列的值,“das”、“dss”和“tri”可能是行的,并且当这些列的任何值,“das”、“dss”和“tri”高于Df1中的“Standard”时,计算Df2和Df3中相同位置的

  • 示例数据: 我想计算每个唯一列名称的平均值和标准偏差(忽略NA)以获得如下输出: 可再现数据: 我得到的最接近的是 这是我从这篇文章中得到的,但我不知道如何调整它来得到我想要的。我知道我可以取rowmeans的平均值来得到每组的平均值,但这不适用于标准差。

  • 问题内容: 任何人都知道如何计算这些列之一的平均值(在Linux上)? 例如:mean(第2栏) 问题答案: Awk: 读为: 对于每一行,将第2列添加到变量“总计”中。 在文件末尾,打印“总计”除以记录数。

  • 问题内容: 我确信必须有一个相对简单的方法来执行此操作,但是此刻正在使我逃脱。假设我有一个这样的SQL表: 现在,我想知道A和B列的每种值组合出现多少次,而与其他列无关。因此,在此示例中,我想要这样的输出: 用什么SQL来确定呢?我觉得这绝对不是一件很不常见的事情。 谢谢! 问题答案:

  • 问题内容: 我正在尝试使用下面的代码来计算用户输入的一组值的平均值,并将其显示在中,但它无法正常工作。假设用户输入7、4和5,该程序在应显示5.3时显示平均值。 代码有什么问题? 问题答案: 当您拥有增强的for循环时,为什么还要对索引使用笨拙的for循环?

  • 本文向大家介绍awk 根据表格数据计算列中的平均值,包括了awk 根据表格数据计算列中的平均值的使用技巧和注意事项,需要的朋友参考一下 示例 给定一个;用作列定界符的文件。我们使用以下程序在第二列中计算值的平均值,提供的输入是学生组的成绩列表: 该程序的输出为2.125。 请记住,它NR保存了要处理的行数,END因此在块中它保存了文件中的总行数。 请记住,在许多应用程序(监视,统计)中,中位数是更