R语言七天入门教程七:项目实战

news2024/11/20 18:21:01

R语言七天入门教程七:项目实战

在完成之前R语言基础知识的学习后,今天的内容是项目实战,通过完成一些小项目来巩固知识。

一、矩阵运算计算器(变量与运算符练习)
1、问题描述

给定矩阵A和B,计算矩阵相加、相减、相乘,如果无法进行相关运算,需要给出提示。

2、解决思路

对于矩阵相加、相减、相乘等操作,对矩阵的形状有特定的要求。因此我们可以先判断形状是否符合要求,如果符合,就返回计算结果;如果不符合,就给出相应提示。

3、代码
# 矩阵加法
mat_add<-function(mat_A, mat_B){
    # dim()函数用于获取矩阵的形状,返回值是一个长度为2的向量,分别表示矩阵的行数和列数
    size_A = dim(mat_A) # 获取矩阵A的形状
    size_B = dim(mat_B) # 获取矩阵B的形状
    if(size_A[1] == size_B[1] && size_A[2] == size_B[2]) # 如果形状相同,则可以相加
        return mat_A + mat_B
    else
        print('The dimensions of mat_A and mat_B are not equal.')
}


# 矩阵减法
mat_minus<-function(mat_A, mat_B){
    size_A = dim(mat_A) # 获取矩阵A的形状
    size_B = dim(mat_B) # 获取矩阵B的形状
    if(size_A[1] == size_B[1] && size_A[2] == size_B[2]) # 如果形状相同,则可以相减
        return mat_A - mat_B
    else
        print('The dimensions of mat_A and mat_B are not equal.')
}

# 矩阵元素乘法
mat_element_multiply<-function(mat_A, mat_B){
    size_A = dim(mat_A) # 获取矩阵A的形状
    size_B = dim(mat_B) # 获取矩阵B的形状
    if(size_A[1] == size_B[1] && size_A[2] == size_B[2]) # 如果形状相同,则可以元素相乘
        return mat_A * mat_B
    else
        print('The dimensions of mat_A and mat_B are not equal.')
}

# 矩阵乘法
mat_multiply<-function(mat_A, mat_B){
    size_A = dim(mat_A) # 获取矩阵A的形状
    size_B = dim(mat_B) # 获取矩阵B的形状
    if(size_A[1] == size_B[2] && size_A[2] == size_B[1]) # 如果形状匹配,则可以相乘
        return mat_A %*% mat_B
    else
        print('The dimensions of mat_A and mat_B do not match.')
}


# 先创建三个矩阵
mat_A = matrix(data=c(1:6), nrow=2, ncol=3, byrow = TRUE)
mat_B = matrix(data=c(7:12), nrow=2, ncol=3, byrow = TRUE)
mat_C = matrix(data=c(13:18), nrow=3, ncol=2, byrow = TRUE)
print(mat_A)
print(mat_B)
print(mat_C)

# 依次调用函数进行计算
mat_add(mat_A, mat_B) 
mat_minus(mat_A, mat_B) 
mat_element_multiply(mat_A, mat_B) 
mat_multiply(mat_A, mat_C)

mat_add(mat_A, mat_C) # 无法计算,给出提示
4、结果

运行结果如下,可以看到由于mat_A和mat_C的形状并不一致,所以无法进行相加:

image-20221116161104059

二、人机猜拳小游戏(程序控制结构练习)
1、问题描述

和电脑进行石头剪刀布的小游戏,由用户进行选择出拳,并统计电脑和用户的得分,用户可以选择是否退出。

2、解决思路

可以考虑一个死循环来监听用户的输入,根据用户不同的输入来进行猜拳或者退出游戏,每次猜拳后就打印游戏得分情况。

3、代码
rock_paper_scissors<-function(){
    win = 0 # 赢的分数
    lose = 0 # 输的分数
    draw = 0 # 平的分数
    while(TRUE){
       choice = readline(prompt='Please input your choice: 1-rock, 2-paper, 3-scissors, 4-quit.--') # 读取当前行用户的输入,并存储到choice变量中
        user_number = as.numeric(choice) # 将字符型的choice变量转换为数字型变量user_number
        # sample函数从给定向量中随机采样, size是采样的个数,此处用于生成随机数
       	pc_number = sample(1:3, size = 1) # 生成区间[1,3]内的一个随机整数		
        if(is.na(user_number)){ # 输入无法转换为数字,说明输入有误,提示用户重新输入
            print('Please input one of "1, 2, 3, 4".')
             next # 直接开始下一次循环
        }else if(user_number == 4){ # 等于4,就退出游戏
            # cat函数用于将字符串和变量值进行拼接
            cat('you win:', win, 'lose:', lose, 'draw:', draw) # 游戏结果
            break
        }else if(user_number == 1){ # 玩家出石头
            if(pc_number == 1) { # 电脑出石头
                print('You choose rock, pc chooses rock.')
                draw = draw + 1 # 平局
            }
            else if(pc_number == 2){ # 电脑出布
                print('You choose rock, pc chooses paper.')
                lose = lose + 1 # 输了
            }
            else if(pc_number == 3) { # 电脑出剪刀
                print('You choose rock, pc chooses scissors.')
                win = win  + 1 # 赢了
            }     
            cat('you win:', win, 'lose:', lose, 'draw:', draw)
        }else if(user_number == 2){ # 玩家出布
            if(pc_number == 1) { # 电脑出石头
                print('You choose paper, pc chooses rock.')
                win = win  + 1 # 赢了
            }
            else if(pc_number == 2){ # 电脑出布
                print('You choose paper, pc chooses paper.')
                draw = draw + 1 # 平局
            }
            else if(pc_number == 3) { # 电脑出剪刀
                print('You choose paper, pc chooses scissors.') 
                lose = lose + 1 # 输了
            }
            cat('you win:', win, 'lose:', lose, 'draw:', draw)
        }else if(user_number == 3){ # 玩家出剪刀
            if(pc_number == 1) { # 电脑出石头
                print('You choose scissors, pc chooses rock.')
               	lose = lose + 1 # 输了
            }
            else if(pc_number == 2){ # 电脑出布
                print('You choose scissors, pc chooses paper.')
                 win = win  + 1 # 赢了
            }
            else if(pc_number == 3) { # 电脑出剪刀
                print('You choose scissors, pc chooses scissors.') 
                draw = draw + 1 # 平局
            }
            cat('you win:', win, 'lose:', lose, 'draw:', draw)
        }else{ # 输入的不是1,2,3,4中的一个,应提示重新输入
            print('Please input one of "1, 2, 3, 4".')
        }
    }
}

# 调用函数,开始游戏
rock_paper_scissors()
4、结果

结果如下,可以看到,每次游戏后,都会显示当前的得分情况,并且对于异常输入也会有提示:

image-20221116173441443

三、学生成绩分析(数据框和文件读写练习)
1、问题描述

给定一个csv文件,里面存放的是班级学生的某次考试成绩,试分析本次考试情况。(中位数、平均数、最高分、最低分、学生分数的区间分布等)

2、解决思路

读取csv文件为数据框,通过对数据框进行查询,获取每门课的成绩,通过因子类型可以更方便地统计学生成绩的区间分布。

3、代码

记录学生成绩的students.csv文件如下:

id,Chinese,Math,English
1,110,120,114
2,107,118,116
3,105,113,118
4,102,112,115
5,98,99,100
6,102,114,117
7,106,112,120
8,96,95,89
9,88,84,86
10,103,104,104

代码如下:

scores = read.csv('students.csv')
print(scores) # 查看成绩
# 我们可以使用summary()函数查看整体的综合信息
summary(scores) # 查看整体统计信息
# 如果要关注单个学科的成绩,以语文成绩为例
summary(scores$Chinese)

# 也可以按需求一项一项查看
mean(scores$Chinese) # 平均分
median(scores$Chinese) # 中位数
max(scores$Chinese) # 最高分
min(scores$Chinese) # 最低分
var(scores$Chinese) # 标准差
table(scores$Chinese) # 各个分数出现的频次
# names函数是获取列名,which.max找出频次最大的列
names(table(scores$Chinese))[which.max(table(scores$Chinese))] # 众数

# 统计图
plot(scores$Chinese,type='o') # 画散点图,type='o'表示把点连起来
chn_factor = factor(scores$Chinese) # 变成因子类型
plot(chn_factor) # 分数直方图
# 108分及以上为优秀,102-107分为良好,其余为及格
cut_factor = cut_factor = cut(scores$Chinese, breaks=c(88,101,107,120),labels=c('及格','良好','优秀'),include.lowest=TRUE)
plot(cut_factor) # 区间分布直方图

# 单个学生的成绩
scores[1,] # 查看第一位学生的成绩
sum(scores[1,2:4]) # 第一位学生的总分,列应只包括第2-4列,因为第一列为id,不是成绩
4、结果

image-20221116212400683

image-20221116212339190

image-20221116212635402

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySql常用内置函数详解

目录日期函数--了解***字符串函数--重要数学函数--了解其他函数--了解MySql为我们提供了一些内主函数&#xff0c;方便我们对特定数据进行相关操作&#xff01; 注意:都是配合select使用哦&#xff0c;个人理解SQL的select相当于C中的printf; 日期函数–了解 一般用于insert in…

C++ 主函数几种语法

Cmain函数的两种写法 1&#xff0c;返回值为int&#xff0c;且main不带参数 #include<iostream> using namespace std; int main() { cout << "Hello C \n" << endl; system("pause"); return 1;//函数返回值取值范围0到255&#xf…

深入了解 JavaScript 语法错误以及如何防止它们

最近&#xff0c;在 Leader 的建议下&#xff0c;去看了看 emotion 和 storybook 的相关文档。学习过后&#xff0c;小有收获。因此&#xff0c;这次将以我自己的视角带你们体验一下 storybook&#xff0c;也算是对我自己学习过程中的一个 review。 何为 storybook 什么是 st…

第2关:伪分布式体验及分布式安装配置

服务器leader选举 为进一步了解ZooKeeper的leader选举过程&#xff0c;本节实训利用服务器的关闭启动&#xff0c;观察服务器的leader产生过程。利用以下命令查看当前服务器节点的状态(/xxx为安装目录)&#xff1a; ./xxx/bin/zkServer.sh status 当仅启动1个服务器节点&…

进博会期间,多地政府领导密集考察深兰科技

从11月初开始&#xff0c;借第五届中国国际进口博览会在上海举办的契机&#xff0c;来自全国各地的地级、县级市的各级领导纷纷来到上海&#xff0c;深入到各个行业领域的国企、央企、民企和跨国企业中走访调研&#xff0c;寻求技术合作&#xff0c;洽谈招商引资。 期间仅1日至…

流体力学基础——简介

流体定义&#xff1a;无规则的运动&#xff0c;流体&#xff1b;流体在静止时内部不能产生剪切力&#xff0c;流动产生的剪切力叫做粘力流体特点&#xff1a; 1、力与变形的关系不同&#xff1b;固体&#xff0c;应力正比于应变&#xff0c;静力学为主&#xff1b;流体&#xf…

DeepLearn关于数组和数的操作

本篇文章纯属作为自己的笔记&#xff0c;因为每次写程序都忘记下面的内容&#xff0c;找起来又很浪费时间&#xff0c;所有就索性一次性都整理下来&#xff0c;后续又不新的不会的内弄也会及时更新到文章当中&#xff0c;方便以后查阅。 DeepLearn关于数组和数的操作Python标准…

【详解】BIO、AIO、NIO Netty 知识点和工作原理

Netty框架 基础 三大网络编程 BIO 同步阻塞:服务器实现模式一个连接一个线程,既客户端有连接请求时,服务器就需要启动一个线程进行处理,如果这个连接不任何事情会造成不必要的线程线程开销 适用场景&#xff1a; 连接数目比较小且固定的架构&#xff0c;这种方式对服务器资源…

Android企业微信分享到小程序

1.官方文档Android应用 - 接口文档 - 企业微信开发者中心https://developer.work.weixin.qq.com/document/path/91196 2.创建应用 登录企业微信管理后台&#xff0c;选择企业应用&#xff0c;选择“企业微信授权登录”&#xff0c;在设置界面填写Android的 App的签名&包名…

[附源码]java毕业设计基于技术的新电商助农平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

HTTP 消息头

title: HTTP 消息头 date: 2022-11-16 14:36 tags: [HTTP,X-Real-IP,Host,X-Forwarded-For,Nginx] 文章目录〇、问题一、前言二、什么是消息头&#xff1f;三、Host四、X-Real-IP五、X-Forwarded-For参考更新〇、问题 什么是HTTP Headers&#xff1f;作用是什么&#xff1f; …

qemu-system-aarch64使用记录

qemu-system-aarch64 使用记录下载安装qemu查看是否支持KVM运行qemu-M内核启动问题内核编译下载安装qemu #!/bin/bashsudo apt update > /dev/null sudo apt upgrade > /dev/null sudo apt-get install -y make gcc g git > /dev/nullcd sudo apt-get install -y r…

一起来庆祝属于GISer的节日GIS DAY

概述 作为一名GISer的你&#xff0c;有没有想过其实我们GISer也有自己的节日&#xff1f;这个节日便是GIS DAY&#xff0c;今年的GIS DAY恰在今天&#xff08;2022年11月16日&#xff09;。究竟什么是GIS DAY&#xff1f;这里为大家介绍一下这个节日。 什么是GIS DAY GIS DA…

Python学习----异常、模块、安装第三方包

异常 异常的含义就不用解释了 打开一个不存在的文件&#xff1a; 异常的捕获 语法&#xff1a; 捕获所有异常 try:可能发生错误的代码 except:发生错误之后执行的代码try:可能发生错误的代码 except Exception as e:发生错误之后执行的代码两种写法都行 捕获指定异常&…

【maptplotlib大全图】一段代码洞查matplotlib图片真谛

此文通过给大家设计一个全面的代码&#xff0c;帮助大家了解matplotlib库画图的全貌 代码解读&#xff0c;略。 图示解读&#xff1a; 对照上图序号和下面序号看代码解释&#xff1a; 1.应用风格使用代码&#xff1a;plt.style.use(sty) 2.文本注释 plt.annotate(‘maximum…

QSS(Qt样式表)概念

Qt样式表是一个可以自定义部件外观的十分强大的机制&#xff0c;除了QStyle更改的样式&#xff0c;其他的都可以由QSS修改。由于受到Html的CSS启发&#xff0c;所以叫QSS。 代码添加样式表ui界面上添加样式表代码添加样式表&#xff1a; setStyleSheet&#xff08;&#xff09…

Beacon帧

一、简介 Beacon帧是802.11中一个周期性的帧&#xff0c;每隔一段时间就会向外界发出一个Beacon(信标)信号用来宣布自己802.11网络的存在。Beacon周期调高&#xff0c;对应睡眠周期拉长&#xff0c;故节能&#xff08;即越来休息100ms再起来发一个包&#xff0c;现在休息200ms…

python学习思路

话不多说&#xff0c;就是开始练习&#xff0c;因为之前编程的经验比较少&#xff0c;怎么办&#xff0c;就像马化腾一样&#xff0c;先抄袭&#xff0c;只有抄袭完成了之后&#xff0c;你才会获得你自己的知识 总体思路是先抄袭&#xff0c;再领悟。最后一定要自己默写打一次。…

电子统计台账:垂直流水账格式数据的导入

目录 1 前言 2 新建项目并打开数据源文件 3 模板设置 4 垂直过滤模板中&#xff0c;流水账过滤条件详细格式说明 1 前言 不少企业记录生产销售数据采用流水账格式。我们可以通过设置过滤模板来导入流水账格式的数据。 企业数据源文件&#xff0c;用excel打开后可以看到格式…

API安全防护解决方案

究竟什么是API 常规定义下&#xff0c;API是应用程序接口&#xff08;Application Programming Interface&#xff09;的简称&#xff0c;其含义比较宽泛&#xff0c;泛指一组定义、程序及协议的集合。随着技术领域的细分和前后端分离架构模式的推广&#xff0c;App应用、小程…