r逐行获得n个均值

时间:2015-07-28 17:24:54

标签: r dataframe mean

我有一个简单的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

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

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

3 个答案:

答案 0 :(得分: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值,则可能需要在na.rm = TRUE中使用rowMeans()。有关详情,请参阅?rowMeans

答案 1 :(得分:1)

使用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)

答案 2 :(得分:1)

我认为最好的选择是使用Richard Scriven发布的rowMeans()。 rowMeans和rowSums相当于使用apply,FUN = mean或FUN = sum但速度要快很多。我发布的应用版仅供参考,以防我们想要传递另一个函数。

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