在R中满足两个条件时计算平均值

4
我正在尝试从我的数据框中获取不同健康状况下男性和女性的平均年龄。
AgeAnalyisi$Age     num
AgeAnalyisi$Gout        logical
AgeAnalyisi$Arthritis   logical
AgeAnalyisi$Vasculitis  logical
etc
AgeAnalysis$Gender      Factor w/ 2 levels

我可以使用以下方法分别获取平均年龄:
mean(AgeAnalysis$Age [AgeAnalysis$Gender=="M" & AgeAnalysis$Gout=="TRUE"] , na.rm = TRUE)

但是是否有更简洁的方法将所有内容汇总到一个表格中,使平均年龄的输出呈现为:
          Male  Female
Gout        x   x
Arthritis   x   x
Vasculitis  x   x
etc         x   x

谢谢你


1
请查看?aggregate、?by和?data.table。 - Ricardo Saporta
2个回答

5
你可以尝试使用aggregate函数:
df <- data.frame(value=1:10, letter=rep(LETTERS[1:2], each=5), group=rep(c(1,2), times=5))
aggregate(value ~ letter * group, data=df, FUN=mean)
#  letter group value
#1      A     1     3
#2      B     1     8
#3      A     2     3
#4      B     2     8

1
这是一个 data.table 的解决方案。
library(data.table)
AgeAnalyisis.DT <- data.table(AgeAnalyisis)

AgeAnalyisis.DT[, lapply(.SD[, !"Age", with=FALSE], function(x) mean(Age[x]))
                , by=Gender]

   Gender     Gout Arthritis Vasculitis
1:      F 54.58333  52.00000   55.81818
2:      M 50.09091  52.69231   52.40000


如果您想进行转置,您可以使用:

# Save the results
res <- AgeAnalyisis.DT[, lapply(.SD[, !"Age", with=FALSE], function(x) mean(Age[x]))
                       , by=Gender]
# Transpose, and assign Gender as column names
results <- t(res[,!"Gender", with=FALSE])
colnames(results) <- res[, Gender]

results
#                   F        M
# Gout       58.30263 57.50328
# Arthritis  66.00217 67.91978
# Vasculitis 59.76155 57.86556

谢谢,这个程序在我的32位R版本上没有运行,但是在64位上可以。另外,我不得不在mean命令中添加na.rm=TRUE,但我很高兴有一个漂亮的表格。 - Stewart Wiseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接