R:如何使用dplyr计算缺少值的每行的平均值

时间:2016-07-16 03:03:44

标签: r dplyr mean

我想计算包含缺失值的数据框中每一行的多个列的均值,并将结果放在一个名为“均值”的新列中。这是我的数据框:

df <- data.frame(A=c(3,4,5),B=c(0,6,8),C=c(9,NA,1))
  A B  C
1 3 0  9
2 4 6 NA
3 5 8  1

如果列没有缺失值,则下面的代码可以成功完成任务,例如A列和B列。

 library(dplyr)
 df %>%
 rowwise() %>%
 mutate(means=mean(A:B, na.rm=T))

     A     B     C   means
  <dbl> <dbl> <dbl> <dbl>
1     3     0     9   1.5
2     4     6    NA   5.0
3     5     8     1   6.5

但是,如果列缺少值,例如C,则会出现错误:

> df %>% rowwise() %>% mutate(means=mean(A:C, na.rm=T))
Error: NA/NaN argument

理想情况下,我想用dplyr实现它。

3 个答案:

答案 0 :(得分:5)

df %>% 
  mutate(means=rowMeans(., na.rm=TRUE))

.是一个“代词”,它引用了通过df传送的数据框mutate

  A B  C    means
1 3 0  9 4.000000
2 4 6 NA 5.000000
3 5 8  1 4.666667

您还可以使用所有常用方法(列名,索引,grep等)仅选择要包含的特定列。

df %>% 
  mutate(means=rowMeans(.[ , c("A","C")], na.rm=TRUE))
  A B  C means
1 3 0  9     6
2 4 6 NA     4
3 5 8  1     3

答案 1 :(得分:3)

在基地R中也很容易完成:

knife vault update

cbind(df, "means"=rowMeans(df, na.rm=TRUE)) A B C means 1 3 0 9 4.000000 2 4 6 NA 5.000000 3 5 8 1 4.666667 执行计算。并允许na.rm参数跳过缺失值,而rowMeans允许您将所需的平均值和名称绑定到data.frame, DF。

答案 2 :(得分:1)

关于OP代码中的错误,我们可以使用连接函数c将这些元素作为单个vector获取,然后执行mean,因为mean可以只有一个论点。

df %>%
    rowwise() %>% 
    mutate(means = mean(c(A, B, C), na.rm = TRUE))
#     A     B     C    means 
#  <dbl> <dbl> <dbl>    <dbl>
#1     3     0     9 4.000000
#2     4     6    NA 5.000000
#3     5     8     1 4.666667

此外,我们可以将rowMeanstransform

一起使用
transform(df, means = rowMeans(df, na.rm = TRUE))
#  A B  C    means
#1 3 0  9 4.000000
#2 4 6 NA 5.000000
#3 5 8  1 4.666667

或使用data.table

library(data.table)
setDT(df)[, means := rowMeans(.SD, na.rm = TRUE)]