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