我试图获得每个男学生的所有6个测验的平均值。 以下是我尝试过的代码的一部分:
a<-subset(mydf,Sex=="M")
b<-a[4:9]
b
sum(b[1:6])
我的逻辑是让一张桌子只包含他们的6个测验中的每一个的男生,然后将表格相加并除以男生的数量。但我认为应该有一种更简单的方法来做到这一点。
示例数据:
df <- data.frame(Section=c(rep('A',9)),
Degree=c(rep('MBA',4),'MS','MBA','MBA','MS','MBA'),
Sex=c(rep('M',5),'F','M','M','F'),
Quiz1=c(0,10,2,2,8,6,6,2,3),
Quiz2=c(0,1,4,4,1,5,0,3,9),
Quiz3=c(6,5,6,6,4,2,7,9,3),
Quiz4=c(5,4,5,5,10,5,7,7,3),
Quiz5=c(7,3,6,3,10,7,6,10,5),
Quiz6=c(3,8,6,6,5,8,10,10,5))
答案 0 :(得分:2)
这个怎么样:
data.frame(df[which(df$Sex=='M'),],QuizMeans=rowMeans(df[which(df$Sex=='M'),c(4:9)]))
注意:&#34; c(4:9)&#34;在上面的代码中获取测验列4-9的行平均值。 因此,我们以这种方式计算每个人的测验分数。
输出:
Section Degree Sex Quiz1 Quiz2 Quiz3 Quiz4 Quiz5 Quiz6 QuizMeans
1 A MBA M 0 0 6 5 7 3 3.500000
2 A MBA M 10 1 5 4 3 8 5.166667
3 A MBA M 2 4 6 5 6 6 4.833333
4 A MBA M 2 4 6 5 3 6 4.333333
5 A MS M 8 1 4 10 10 5 6.333333
7 A MBA M 6 0 7 7 6 10 6.000000
8 A MS M 2 3 9 7 10 10 6.833333
然后,如果你想采取他们的平均值(即平均值),你可以将上面的内容存储为&#34; df&#34;,然后使用mean()来计算列的平均值QuizMeans,像这样:
df <- data.frame(df[which(df$Sex=='M'),],QuizMeans=rowMeans(df[which(df$Sex=='M'),c(4:9)]))
mean(df$QuizMeans)
[1] 5.285714
如果数据中缺少值,则需要将na.rm = TRUE添加到mean()或rowMeans()函数中,如下所示:
mean(df$QuizMeans, na.rm=TRUE)
[1] 5.285714
答案 1 :(得分:0)
您可以在不指定列位置的情况下使用以下内容
ans <- sum(df[df$Sex=="M", grepl("Quiz",names(df))])/sum(df$Sex=="M")
# 31.71429
如果您知道列位置
ans <- sum(df[df$Sex=="M", 4:9])/sum(df$Sex=="M")
# 31.71429
数据
df <- data.frame(Section=c(rep('A',9)),
Degree=c(rep('MBA',4),'MS','MBA','MBA','MS','MBA'),
Sex=c(rep('M',5),'F','M','M','F'),
Quiz1=c(0,10,2,2,8,6,6,2,3),
Quiz2=c(0,1,4,4,1,5,0,3,9),
Quiz3=c(6,5,6,6,4,2,7,9,3),
Quiz4=c(5,4,5,5,10,5,7,7,3),
Quiz5=c(7,3,6,3,10,7,6,10,5),
Quiz6=c(3,8,6,6,5,8,10,10,5))
答案 2 :(得分:-1)
使用dplyr
。
library(dplyr)
mydf %>% filter(Sex == "Male") %>%
summarise(avg_q6 = mean(Quiz6))