r 逐行获取 n 列的平均值

r get mean of n columns by row

我有一个简单的data.frame

> df <- data.frame(a=c(3,5,7), b=c(5,3,7), c=c(5,6,4))
> df
  a b c
1 3 5 5
2 5 3 6
3 7 7 4

是否有一种简单有效的方法来获得具有相同行数但均值为例如 a 列和 b 列的新 data.frame?像这样:

  mean.of.a.and.b c
1               4 5
2               4 6
3               7 4

仅对前两列使用 rowMeans()。然后cbind()到第三列。

cbind(mean.of.a.and.b = rowMeans(df[-3]), df[3])
#   mean.of.a.and.b c
# 1               4 5
# 2               4 6
# 3               7 4

注意:如果您的原始数据中有任何 NA 值,您可能需要在 rowMeans() 中使用 na.rm = TRUE。有关更多信息,请参阅 ?rowMeans

另一个使用 dplyr 包的选项:

library("dplyr")

df %>%
  rowwise()%>%
  mutate(mean.of.a.and.b = mean(c(a, b))) %>%
  ## Then if you want to remove a and b:
  select(-a, -b)

我认为最好的选择是使用由 Richard Scriven 编辑的 rowMeans() post。 rowMeans 和 rowSums 等同于将 apply 与 FUN = mean 或 FUN = sum 一起使用,但速度要快得多。我post带apply的版本仅供参考,以防我们想传递另一个功能。

data.frame(mean.of.a.and.b = apply(df[-3], 1, mean), c = df[3])

输出:

  mean.of.a.and.b c
1               4 5
2               4 6
3               7 4

使用 SQL 和 sqldf

非常冗长
library(sqldf
sqldf("SELECT (sum(a)+sum(b))/(count(a)+count(b)) as mean, c 
      FROM df group by c")

输出:

  mean c
1    7 4
2    4 5
3    4 6