R中各列的平均值,不包括NAs

R中各列的平均值,不包括NAs,r,average,R,Average,我无法想象我是第一个提出这个问题的人,但我还没有找到解决办法(在这里或其他地方) 我有几个列,我想在R中求平均值。唯一最简单的方面是有些列包含NAs 例如: Trait Col1 Col2 Col3 DF 23 NA 23 DG 2 2 2 DH NA 9 9 > dat <- data.frame(Trait = c("DF","DG","DH"), mat) > names(dat) <- c("Trait", pas

我无法想象我是第一个提出这个问题的人,但我还没有找到解决办法(在这里或其他地方)

我有几个列,我想在R中求平均值。唯一最简单的方面是有些列包含NAs

例如:

Trait Col1 Col2 Col3
DF    23   NA   23
DG    2    2    2
DH    NA   9    9
> dat <- data.frame(Trait = c("DF","DG","DH"), mat)
> names(dat) <- c("Trait", paste0("Col", 1:3))
> dat
  Trait Col1 Col2 Col3
1    DF   23   NA   23
2    DG    2    2    2
3    DH   NA    9    9
> dat <- transform(dat, Col4 = rowMeans(dat[,-1], na.rm = TRUE))
> dat
  Trait Col1 Col2 Col3 Col4
1    DF   23   NA   23   23
2    DG    2    2    2    2
3    DH   NA    9    9    9
我想创建一个Col4,将前3列中的条目平均,忽略NAs。 因此:

理想情况下,类似这样的方法会起作用:

data$Col4 <- mean(data$Chr1, data$Chr2, data$Chr3, na.rm=TRUE)
data$Col4您需要
rowMeans()
但重要的是,它有一个
na.rm
参数,您希望将其设置为
TRUE
。例如:

> mat <- matrix(c(23,2,NA,NA,2,9,23,2,9), ncol = 3)
> mat
     [,1] [,2] [,3]
[1,]   23   NA   23
[2,]    2    2    2
[3,]   NA    9    9
> rowMeans(mat)
[1] NA  2 NA
> rowMeans(mat, na.rm = TRUE)
[1] 23  2  9
>垫子
[,1] [,2] [,3]
[1,]23 NA 23
[2,]    2    2    2
[3,]NA 9
>rowMeans(mat)
[1] 钠2钠
>行平均值(mat,na.rm=TRUE)
[1] 23  2  9
要匹配您的示例,请执行以下操作:

Trait Col1 Col2 Col3
DF    23   NA   23
DG    2    2    2
DH    NA   9    9
> dat <- data.frame(Trait = c("DF","DG","DH"), mat)
> names(dat) <- c("Trait", paste0("Col", 1:3))
> dat
  Trait Col1 Col2 Col3
1    DF   23   NA   23
2    DG    2    2    2
3    DH   NA    9    9
> dat <- transform(dat, Col4 = rowMeans(dat[,-1], na.rm = TRUE))
> dat
  Trait Col1 Col2 Col3 Col4
1    DF   23   NA   23   23
2    DG    2    2    2    2
3    DH   NA    9    9    9
>dat名称(dat)dat
性状Col1 Col2 Col3
1 DF 23 NA 23
2 DG 2 2
3 DH NA 9
>dat dat
性状Col1 Col2 Col3 Col4
1 DF 23 NA 23
2 DG 2 2
3 DH NA 9

为什么不接受接受答案? 公认的答案是正确的,但是,它对于这一特定任务过于具体,不可能一概而论。如果我们需要的不是
mean
,而是其他统计数据,如
var
偏度
,甚至是自定义函数,该怎么办

更灵活的解决方案:

row_means <- apply(X=data, MARGIN=1, FUN=mean, na.rm=TRUE)
其中:

  • X
    :数据帧或矩阵形式的数据
  • MARGIN
    :发生聚合的维度。行操作使用
    1
    ,列操作使用
    2
  • FUN
    :对数据调用的操作。这里可以使用任何预定义的R函数以及任何用户定义的函数
  • na.rm
    :如果
    TRUE
    ,则在调用
    FUN
    之前将删除
    na
我为什么要使用
应用

原因很多,包括但不限于:

  • 任何功能都可以轻松插入
    apply
  • 对于不同的首选项,例如输入或输出数据类型,可以使用其他变体(例如,
    lappy
    用于列表上的操作)
  • 最重要的是)它促进了可伸缩性,因为此函数有允许并行执行的版本(例如,
    {parallel}
    库中的
    mclappy
    )。例如,请参见或

  • ?行意味着
    应该为您做这件事。它主要是
    apply(…,1,mean)
    的包装器。它不是apply()的包装器。众所周知,它的速度要快得多。这意味着它是!谢谢你的时间:]这是(正确的,但)不够普遍,不值得记住。我添加了另一个答案。@azim这里的标签中有超过300000个问题。很多人给出了
    apply()
    和co作为可能的答案。问题是关于行的意思;您不希望常规地使用
    apply()
    来执行此操作,因为相比之下,它非常慢。您回答的问题在这里没有被问到,但在这里其他地方被问了很多次。@GavinSimpson这个问题没有说明执行时间或数据集很大的事实。主要问题是如何在计算
    均值时去除NA。此外,您始终可以翻转数据帧并对列而不是行进行操作。此外,您可以并行运行,并且比任何“快速”但连续的操作运行得更快。使用
    apply
    函数系列非常简单。我对这个答案的主要问题是它的局限性。我认为,对存在的每个函数都使用一行函数是不现实的。@Azim,问题并不是说要做任何事情,而是在计算
    NA
    s时对行采用平均值。但这并没有阻止你来到这里&告诉人们正确的答案“不值得记住”。我关心执行时间&如果你选择在你写的代码中使用
    rowMeans()
    &
    colMeans()
    ,尤其是其他人使用的代码,那么你应该选择执行时间。您可能认为具有行或列的特殊函数并不重要,但其他人不同意;matrixStats软件包专门添加了许多易于加速的常用函数。您不必提及不应使用
    apply()
    执行OP所需操作的重要原因;很慢。