在R中获得具有某些条件的表的平均值的更简单方法

时间:2017-09-11 01:49:33

标签: r

我试图获得每个男学生的所有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))

3 个答案:

答案 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))