#1.生成50名学生的学号
# 2. 生成符合正态分布的成绩,范围在指定区间内
set.seed(122) # 为了可重复性
math_scores <- round(rnorm(50, mean=70, sd=15))
math_scores <- ifelse(math_scores < 40, 40, ifelse(math_scores > 100, 100, math_scores))
english_scores <- round(rnorm(50, mean=75, sd=15))
english_scores <- ifelse(english_scores < 50, 50, ifelse(english_scores > 100, 100, english_scores))
statistics_scores <- round(rnorm(50, mean=70, sd=15))
statistics_scores <- ifelse(statistics_scores < 40, 40, ifelse(statistics_scores > 100, 100, statistics_scores))
math_scores <- round(rnorm(50, mean=70, sd=15))
math_scores <- ifelse(math_scores < 40, 40, ifelse(math_scores > 100, 100, math_scores))
english_scores <- round(rnorm(50, mean=75, sd=15))
english_scores <- ifelse(english_scores < 50, 50, ifelse(english_scores > 100, 100, english_scores))
statistics_scores <- round(rnorm(50, mean=70, sd=15))
statistics_scores <- ifelse(statistics_scores < 40, 40, ifelse(statistics_scores > 100, 100, statistics_scores))
# 3. 将生成的数据组合成一个数据框,并保存到CSV文件
scores_df <- data.frame(StudentID=student_ids, Math=math_scores, English=english_scores, Statistics=statistics_scores)
write.csv(scores_df, "data.csv", row.names = FALSE)
# 4. 从CSV文件读取数据,并计算各科成绩的均值和标准差
scores_df <- read.csv("2109014101score.csv")
mean_scores <- colMeans(scores_df[, c("Math", "English", "Statistics")])
mean_scores
std_dev_scores <- sapply(scores_df[, c("Math", "English", "Statistics")], sd)
std_dev_scores
# 5. 计算各科成绩的最高分、最低分,并找到对应的学生学号
max_scores <- apply(scores_df[, c("Math", "English", "Statistics")], 2, max)
min_scores <- apply(scores_df[, c("Math", "English", "Statistics")], 2, min)
max_score_students <- scores_df[scores_df$Math == max_scores['Math'] |
scores_df$English == max_scores['English'] |
scores_df$Statistics == max_scores['Statistics'], ]
max_score_students
min_score_students <- scores_df[scores_df$Math == min_scores['Math'] |
scores_df$English == min_scores['English'] |
scores_df$Statistics == min_scores['Statistics'], ]
min_score_students
# 6. 计算每位学生的总分,并按总分高低排序学号
scores_df$Total <- rowSums(scores_df[, c("Math", "English", "Statistics")])
sorted_students <- scores_df %>% arrange(desc(Total)) %>% select(StudentID)
sorted_students
# 7. 画出总分及各科成绩的直方图和箱图
par(mfrow=c(2, 2))
hist(scores_df$Math, main="数学成绩分布", xlab="分数", col="blue")
hist(scores_df$English, main="英语成绩分布", xlab="分数", col="green")
hist(scores_df$Statistics, main="统计学成绩分布", xlab="分数", col="red")
hist(scores_df$Total, main="总分分布", xlab="总分", col="purple")
boxplot(scores_df$Math, scores_df$English, scores_df$Statistics,
names=c("数学", "英语", "统计学"), main="各科成绩箱线图")
# 8. 将成绩转化为五级评分制,并绘制相应的图表
# 定义成绩等级标签
grades <- c("不及格", "及格", "中等", "良好", "优秀")
# 定义转换成绩为等级的函数
convert_to_grade <- function(score, lower_limits=c(60, 70, 80, 90)) {
sum(score >= lower_limits) + 1
}
# 应用函数并转换成绩为等级
scores_df$MathGrade <- factor(sapply(scores_df$Math, convert_to_grade), levels=1:5, labels=grades)
scores_df$EnglishGrade <- factor(sapply(scores_df$English, convert_to_grade), levels=1:5, labels=grades)
scores_df$StatisticsGrade <- factor(sapply(scores_df$Statistics, convert_to_grade), levels=1:5, labels=grades)
# 绘制饼图
par(mfrow=c(1, 3))
pie(table(scores_df$MathGrade), main="数学成绩")
pie(table(scores_df$EnglishGrade), main="英语成绩")
pie(table(scores_df$StatisticsGrade), main="统计学成绩")
# 绘制群集条形图
barplot(rbind(table(scores_df$MathGrade), table(scores_df$EnglishGrade), table(scores_df$StatisticsGrade)),
beside=TRUE, legend.text=TRUE, args.legend=list(x="topright"),
main="各科成绩群集条形图")
# 绘制堆积条形图
barplot(rbind(table(scores_df$MathGrade), table(scores_df$EnglishGrade), table(scores_df$StatisticsGrade)),
beside=FALSE, legend.text=TRUE, args.legend=list(x="topright"),
main="各科成绩堆积条形图")
# 绘制百分比堆积条形图
barplot(prop.table(rbind(table(scores_df$MathGrade), table(scores_df$EnglishGrade), table(scores_df$StatisticsGrade)),
margin=1), legend.text=TRUE, args.legend=list(x="topright"),
main="各科成绩百分比堆积条形图")