R语言学习记录
更完了,累似了!
一、基本数学运算
1.%% 计算余数
2.%/%计算所得的整数部分
3.**或^次方根
4.abs() 绝对值
5.exp() e的x次
5.round() 四舍五入函数
round(98.562,digits=2)=98.56
round(1234,digits=-2)=1200
round(1778,digits=-3)=2000
6.signif(x,digits=k) 四舍五入,x为要处理的实数,k为有效数字个数
signif(79843.597,digits=6)=79843.6
signif(79843.597,6)=79843.6
signif(79843.597,digits=3)=79800
signif(79843.597,3)=79800
7.floor(x) 小于等于x的最近整数
8.ceiling(x) 大于等于x的最近整数
9.trunc(x) 直接取整数,抹去小数
10.factorial(x) 返回x的阶乘
11.Inf 无限大
12.is.infinite(x) 判断是否无限大,如果是则TRUE,不是则FALSE
13.NaN() 非数字或无定义数字
14、is.nan(x) 判断是否为nan,如果是则TRUE,不是则FALSE
15.NA 缺失值,是一个有效数值,可以用做计算,但结果通常为NA
16.is.na(x) 判断是否为NA,如果是则返回TRUE,不是则返回FALSE
二、向量对象运算
1.当向量相加时,如果二者长度不相等,则长向量必须是短向量长度的倍数。
2.seq(from,to,by=width,length.out=numbers) from为起始值,to为最终值,by是每个元素的增值,length.out为元素个数
3.c() 将括号内的元素连接成为一个向量
4.rep() 重复向量对象rep(x,times=重复次数,each=每个元素的重复次数,length.out=向量长度)
> rep(1:3,times=3,each=2,length.out=18)
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
5.prod() 所有元素相乘
6.cumsum() 前缀和
7.cumprod() 前缀乘积
8.cummax() 前缀最大值
9.cummin() 前缀最小值
10.diff() 与下一个元素之差
11.sort(x,decreasing=FALSE) 排序,默认从小到大,如果为TRUE,则为从大到小
12.rank() 排序后所得的位次
13.rev() 对向量颠倒排序
14.length() 计算字符串向量长度
15.nchar() 字符串向量对象每一个元素的字符数
16.is.integer() 对象元素是否为整数
17.is.numeric() 对象元素是否为数字
18.is.double() 对象是否为双精度实数
19.is.character() 对象是否为字符串
20.str() 查看对象的结构
21.class() 查看对象的数据类型
22.rep() 向量索引是从1开始的
> x<-1:5
[1] 1 2 3 4 5
> new_x <- x[-1]
[1] 2 3 4 5
23.tail(x,number) 取x的最后number个元素
> tail(LETTERS,4)
[1] "W" "X" "Y" "Z"
24.head(x,number) 取x的前number个元素
> head(LETTERS,4)
[1] "A" "B" "C" "D"
25.which() 根据条件,找出索引值。
> x<-1:10
> which(x>5)
[1] 6 7 8 9 10
26.which.max()和which.min() 列出第一个最大值或最小值的索引值
> x <- seq(3,9)
> which.max(x)
[1] 7
> which.min(x)
[1] 1
27.剔除na值
> x <- c(1,2,NA,3,4)
> x[x>1 & !is.na(x)]
[1] 2 3 4
28.向量对象的元素名称
> ## 建立带名字的向量
> home <- c(blog="ldy",v1="ljl",v2="wj")
> home
blog v1 v2
"ldy" "ljl" "wj"
> ## 列出向量的名字
> names(home)
[1] "blog" "v1" "v2"
> ## 改变向量名字
> names(home)<-c("v1","v2","v3")
> home
v1 v2 v3
"ldy" "ljl" "wj"
三、处理矩阵与更高维数据
1.matrix(data,nrow=,ncol=,byrow=logical,dimnames=NULL) data代表数据,nrow为预计行的数量,ncol为预计列的数量,byrow=logical表示按列填数据,,dimnames为矩阵属性
> x<-matrix(1:12,3,4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
2.nrow() 查看行数
3.ncol() 查看列数
4.dim() 查看行数和列数
5.length() 查看元素个数
6.is.matrix() 是否是矩阵
7.is.array() 是否是Array
8.rbind()与cbind() 合成矩阵
9.矩阵元素的取得,直接按照下标取,用负值是不取
10.rownames()与colnames() 取得行列名和修改行列名
> example_matrix <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3)
> example_matrix
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> rownames(example_matrix) <- c("Row1", "Row2")
> example_matrix
[,1] [,2] [,3]
Row1 1 3 5
Row2 2 4 6
11.dimnames() 也可以取得或设置行列名
12.rowSums()、colSums()、rowMeans()、colMeans() 行列的运算
13.t() 将矩阵转置
14.%*% 矩阵相乘
> matrix(1:6,2,3)%*%matrix(1:9,3,3)
[,1] [,2] [,3]
[1,] 22 49 76
[2,] 28 64 100
15.diag() 对角线
16.solve() 反矩阵
17.det() 行列式
18.dim() 建立多维矩阵
> data <- 1:24
> dim(data) <- c(3, 4, 2)
> data
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24
19.identical() 比较两个对象是否完全相同
四、因子
1.factor(x,levels=,labels=,ordered=) 创建一个因子,可以指定因子的水平、每个元素的标签、是否有序
> str1 <- c("A",'B',"D","C","A","B",'B',"C")
> str2 <- factor(str1,levels=c("D","C","B",'A'),ordered=TRUE)
> str2
[1] A B D C A B B C
Levels: D < C < B < A
2.as.factor() 单纯创造因子
3.levels 可以指定缺失值
4.as.character() 转化成字符串向量
5.as.numeric() 转化为数值向量
6.nlevels() 查看水平数量
7.table() 查看各元素出现次数
> str2
[1] A B D C A B B C
Levels: D < C < B < A
> table(str2)
str2
D C B A
1 2 3 2
五、数据框
1.data.frame() 建立一个数据框
names <- c("Alice", "Bob", "Charlie")
> ages <- c(25, 30, 35)
> genders <- c("Female", "Male", "Male")
> df <- data.frame(names, ages, genders)
> df
names ages genders
1 Alice 25 Female
2 Bob 30 Male
3 Charlie 35 Male
2.rownames()、colnames()、names() 均可更改行列名
3.数据框的取值方法与矩阵相同
4.$ 可以读取数据框内的数据
> df
names ages genders
1 Alice 25 Female
2 Bob 30 Male
3 Charlie 35 Male
> df$names
[1] "Alice" "Bob" "Charlie"
> df[1]
names
1 Alice
2 Bob
3 Charlie
> df[1,]
names ages genders
1 Alice 25 Female
> df[,1]
[1] "Alice" "Bob" "Charlie"
5.rbind() 增加行数
> df
names ages genders
1 Alice 25 Female
2 Bob 30 Male
3 Charlie 35 Male
> df <-rbind(df,c("ldy",22,"Male"))
> df
names ages genders
1 Alice 25 Female
2 Bob 30 Male
3 Charlie 35 Male
4 ldy 22 Male
6.cbind() 增加列数
7.$ 用来增加列数
> df
names ages genders
1 Alice 25 Female
2 Bob 30 Male
3 Charlie 35 Male
4 ldy 22 Male
> df$heigh <- c(166,184,177,173)
> df
names ages genders heigh
1 Alice 25 Female 166
2 Bob 30 Male 184
3 Charlie 35 Male 177
4 ldy 22 Male 173
六、串行List
1.list() 用来建立串行
> test <- list(name="ldy",school="qzu",info=c(62,173))
$name
[1] "ldy"
$school
[1] "qzu"
$info
[1] 62 173
2.names() 获取串行内的名称或者修改名字
3.$ 获取串行内的元素
> test$name
[1] "ldy"
4.[[]] 获取串行内对象的元素内容
> test[1]
$name
[1] "ldy"
> test[[1]]
[1] "ldy"
> test[["name"]]
[1] "ldy"
5.c() 将2个串行合并
6.str() 解析串行内容
> str(test)
List of 3
$ name : chr "ldy"
$ school: chr "qzu"
$ info : num [1:2] 62 173
七、进阶字符串的处理
1.strsplit() 语句分割
> x<-c("hello R world")
> strsplit(x," ")
[[1]]
[1] "hello" "R" "world"
2.toupper()与tolower() 大小写转化
3.unique() 去除重复的元素
4.paste() 可以连接字符串,如果长度不一致,会循环
## 单字符串
> x<-c("I","am","ldyer")
> x<-paste(x,collapse="-")
> x
[1] "I-am-ldyer"
## 多字符串
> x<-letters[1:6]
> y<-LETTERS[1:6]
> paste(x,y,sep="-")
[1] "a-A" "b-B" "c-C" "d-D" "e-E" "f-F"
5.sort() 字符串向量排序
> sort(c("abc","hello","zzc","ldy","lk","chx"))
[1] "abc" "chx" "hello" "ldy" "lk" "zzc"
> sort(c("abc","hello","zzc","ldy","lk","chx"),decreasing=TRUE)
[1] "zzc" "lk" "ldy" "hello" "chx" "abc"
6.substr() 截取字符串向量
> x<-c("abc","hello","zzc","ldy","lk","chx")
> substr(x,start=1,stop=2)
[1] "ab" "he" "zz" "ld" "lk" "ch"
7.grep(pattern,x) 在x中搜索含有pattern的字符串元素下标
> x<-c("abc","hello","zzc","ldy","lk","chx")
> grep("l",x)
[1] 2 4 5
> x[grep("l",x)]
[1] "hello" "ldy" "lk"
8.sub(pattern,replacement,x) 用做字符串的更改,x为字符串向量,pattern为要搜索的字符串,replacement为取代的字符串
> x<-c("abc","hello","zzc","ldy","lk","chx")
> sub("l","666",x)
[1] "abc" "he666lo" "zzc" "666dy" "666k" "chx"
八、日期和时间的处理
1.as.Date() 设置日期向量
> x<-as.Date("2002-12-24")
> x
[1] "2002-12-24"
2.weekdays() 返回日期的周几
> x<-as.Date("2002-12-24")
> weekdays(x)
[1] "星期二"
3.months() 返回日期的月份 与 指定日期格式
## 返回日期
> x<-as.Date("2002-12-24")
> months(x)
[1] "十二月"
## 指定日期格式
> as.Date("24 12 2002",format="%d %m %y")
[1] "2020-12-24"
> as.Date("24-12-2002",format="%d-%m-%y")
[1] "2020-12-24"
4.quarters() 返回日期的季度
> x<-as.Date("2002-12-24")
> quarters(x)
[1] "Q4"
5.Sys.localeconv() 返回目前所使用系统的本地化的各项参数的使用格式
> Sys.localeconv()
decimal_point thousands_sep grouping int_curr_symbol currency_symbol
"." "" "" "CNY" "¥"
mon_decimal_point mon_thousands_sep mon_grouping positive_sign negative_sign
"." "," "\003" "" "-"
int_frac_digits frac_digits p_cs_precedes p_sep_by_space n_cs_precedes
"2" "2" "1" "0" "1"
n_sep_by_space p_sign_posn n_sign_posn
"0" "4" "4"
6.Sys.Date() 返回当前系统日期
> Sys.Date()
[1] "2024-06-19"
7.seq() 可以设置日期的间隔时间
> x<-as.Date("2002-12-24")
> seq(x,by="1 months",length.out=12)
[1] "2002-12-24" "2003-01-24" "2003-02-24" "2003-03-24" "2003-04-24" "2003-05-24" "2003-06-24"
[8] "2003-07-24" "2003-08-24" "2003-09-24" "2003-10-24" "2003-11-24"
8.Sys.time() 返回目前的系统时间
> Sys.time()
[1] "2024-06-19 14:23:02 CST"
9.ts() 建立时间序列这个最好自己练练
ts(x,start=,end=,frequency=)
x指数据内容,start是时间起始点,end是结束时间,通常可以省略,frequency是时间间隔
九、编写自己的函数
1.函数 可以作为一个对象
2.return() 有时候可以省去,因为R语言默认返回函数代码的最后一行值
3.函数 “{}”有时候是可以省略的
4.... 用来设置多个函数参数
5.函数 可以当做参数
6.通用函数 是指当一个函数接收到参数后,什么都不做,就只是将其作为分配其他函数执行,例如 print()
7.样例 设计一个计算电费的通用函数,每度电100元,如果输入的不是数值向量,则输出“输入错误,请重新输入数值向量”
> jisuan <- function(x,...){
+ if(is.numeric(x)){
+ n=x*10
+ print(n)
+ }else{
+ print("输入错误,请重新输入数值向量。")
+ }
+ }
> jisuan(c(1,2,3,4))
[1] 10 20 30 40
> jisuan("ldy")
[1] "输入错误,请重新输入数值向量。"
十、程序流程的控制
略
十一、认识apply家族
1.apply(x,MARGIN,FUN,...) x为要处理的对象,MARGIN为行列(1代表行,2代表列),FUN为要使用的函数,…为要使用的额外参数
> test<-function(){
+ an_info<-matrix(c(3,4,9,5,5,NA,7,3,5),nrow=3)
+ colnames(an_info)<-c("老虎","狮子","励家磊")
+ rownames(an_info)<-c("DAY1","DAY2","DAY3")
+ print(an_info)
+ apply(an_info,2,max,na.rm=TRUE)
+ }
> test()
老虎 狮子 励家磊
DAY1 3 5 7
DAY2 4 5 3
DAY3 9 NA 5
老虎 狮子 励家磊
9 5 7
2.sapply(x,FUN,...) x为一个列表、向量或数据框,或者是一个其他可以迭代的对象,FUN为要使用的函数,…为要使用的额外参数
> list <- list(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))
> means <- sapply(list, mean)
> sapply(list, mean)
[1] 2 5 8
3.lapply(x,FUN,...) x为一个列表、向量或数据框,或者是一个其他可以迭代的对象,FUN为要使用的函数,…为要使用的额外参数
> list <- list(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))
> lapply(list, mean)
[[1]]
[1] 2
[[2]]
[1] 5
[[3]]
[1] 8
3.tapply(x,FUN,...) x为一个向量或一个数据框,FUN为要使用的函数,…为要使用的额外参数
> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
> f <- factor(c("A", "A", "B", "B", "C", "C", "A", "B", "C", "C"))
> tapply(x, f, sum)
A B C
10 15 30
4.lapply和sapply主要用于列表和向量,lapply总是返回列表,而sapply尝试简化输出。apply用于数组的维度,返回值取决于应用的维度和函数。tapply用于根据因子向量的水平对数据进行分组,并应用函数,返回列表或数组。
十二、输入与输出
1.getwd() 获取当前的工作目录
2.setwd() 更改当前工作目录
3.file.path() 将路径合成为完整路径
4.dir() 列出当前目录下的所有文件和子目录
5.list.files() 列出当前目录下的所有文件和子目录
6.file.exist() 判断文件是否存在
7.file.rename() 更改文件名字
8.file.create() 建立文件
9.file.copy() 复制文件
10.file.remove() 删除文件
11.cat() cat(…, file = “”, sep = " ", fill = FALSE, labels = NULL, append = FALSE) …:要输出的一个或多个字符串、表达式或变量。file:一个字符串,指定输出文件的路径。如果省略或为空字符串(默认),则输出到控制台。sep:一个字符串,用于分隔输出的各个部分。默认是空格。fill:逻辑值,指示是否在输出中插入换行符以避免超过指定的宽度。默认是FALSE。labels:一个字符向量,用于为输出的每个部分添加标签。append:逻辑值,指示是将输出追加到指定文件中(TRUE)还是覆盖文件(FALSE)。默认是FALSE。
12.scan(file=,waht=double(),namx=-1,seq=,skip=0,nlines=0,na.strings=NA) file为所读文件,默认为屏幕输入,what为输入数据类型,默认为双倍精确实数,nmax为限定读入多少行数据,默认为-1,表示无限制,seq表示数据的间隔,默认是空格或者换行符,nlines为最多读入多少行数据,na.string 可以设定遗失值的符号,默认为NA
13.readClipboard() 用于从系统剪贴板中读取文本数据,适用于快速复制粘贴数据的场景
14.readWorksheetFromFile() readWorksheetFromFile(file, sheet, startRow, endRow, startCol, endCol, header = TRUE)从 Excel 文件中读取工作表数据
file:一个字符串,指定Excel文件的路径。
sheet:一个字符串,指定要读取的工作表名称。
startRow:一个整数,指定开始读取的行号。
endRow:一个整数,指定结束读取的行号。
startCol:一个整数,指定开始读取的列号。
endCol:一个整数,指定结束读取的列号。
header:逻辑值,指示是否将第一行作为列名。默认是TRUE。
## 读取Excel文件中的特定工作表
data <- readWorksheetFromFile("path/to/excel/file.xlsx", sheet = "Sheet1")
## 读取特定行和列范围内的数据
data <- readWorksheetFromFile("path/to/excel/file.xlsx", sheet = "Sheet1", startRow = 2, endRow = 10, startCol = 2, endCol = 4)
## 读取数据,但不使用第一行作为列名
data <- readWorksheetFromFile("path/to/excel/file.xlsx", sheet = "Sheet1", header = FALSE)
十三、数据分析与处理
1.sample(x,size,replace) 随机抽取,x代表向量(范围),size指抽取的个数,replace默认为FALSE,如果为TRUE,则代表有放回的抽取
2.cut(x,num) 切割数据,x代表数据集,num代表切割的数量
3.merge() x和y为要合并的数据集,by:用于合并的列的名称。如果省略,默认情况下,merge() 会尝试找到两个数据集具有相同名称的列,并使用这些列作为键。
例题
1、哪个函数可以将字符串改成小写。
tolower()
2、哪个函数可用于设置日期向量,这个函数的默认日期格式如何。
as.Date()
年-月-日
3、R语言提供的is.na()函数作用。
检查元素是否为缺失值,是则返回TRUE,不是则返回FALSE
4、使用factor()函数最重要的参数以及使用方法。
levels参数:
levels是一个字符向量,用于指定因子可以取的所有可能值。
如果不指定levels,factor()会自动从向量中提取不同的值作为水平。
labels参数:
为因子设定标签
ordered参数:
ordered是一个逻辑值,用于指定因子是否有序。
如果设置为TRUE,factor()会创建一个有序因子。
如果设置为FALSE,factor()会创建一个无序因子。
5、在Console窗口下,常用的操作函数。
cat():用于连接字符串并打印到控制台。
print():用于打印变量到控制台。
getwd():用于获取当前工作目录。
setwd():用于设置当前工作目录。
dir():用于列出指定目录中的文件和子目录。
file.show():用于在Console窗口中显示文件内容。
source():用于从文件中读取R代码并执行。
browser():用于暂停执行并进入一个交互式Console窗口。
grep():用于在字符串中搜索指定的模式。
readLines():用于从文件中读取一行或多行文本。
writeLines():用于将文本写入文件。
read.table():用于从文本文件中读取数据,并将其转换为数据框或向量。
write.table():用于将数据框或向量写入文本文件。
6、r语言主要是以什么为基础,开发完成的,R的一个重要优点是什么。
R语言主要是以S语言为基础
R的一个重要优点是,R是Open Source License,这表示任何人都可以下载并修改,因此许多人在编写增强功能的套件,同时供其他人免费使用。
7、不论是使用直译器或是R程序文件中,程序注释如何使用。
## 这是一个注释
8、哪个函数可以取得和修改矩阵对象的列名。
colnames()
9、什么数据是由一系列的列向量( Column Vector)所组成的,我们可以将它视为矩阵的扩充。不同列的向量的元素类别可以不同。
数据框(data frame)
10、哪个函数可用于建立一个规则型的数值向量对象。
seq(from,to,by=width,length.out=numbers)
11、哪种数据是一种具有很大弹性的对象,在同一串行内可以有不同属性的元素,例如,字符、字符串或数值。建立串行(List)所需的函数是什么。
列表list
list()
12、常用简单数据类型有三种,分别是什么。
(书里没找到原文,找到了告诉我一声)
数值型(Numeric)
字符型(Character)
逻辑型(Logical)
13、R的基本命名规则是什么。
①不能用R语言保留字,如break,else,FALSE,TRUE,for,function,while,next,repeat,return,Inf,NA,NaN等等。
②R语言对大小写敏感
③名称必须以字母(大写或小写)或句点(.)开头,如果是“.”开头,则第二个不能是数字,其余则后面可以跟字母、数字、下划线(_)或句点。
④对象名称只能包含字母、数字、“_”和“.”
14、基本上可以将RStudio整合式窗口分成以下4大区域,分别是什么。
Source Editor 左上角
Console 左下角
Workspace 右上角
Files、Plots、Packages、Help和Viewer 右下角
15、R语言碰上多种计算同时出现在一个指令内时,R语言控制运算的优先级如何计算。
指数>>乘、除、求余、求整>>加、减
16、计算下列命令的结果Inf-NaN、NA+Inf、Inf-NA、NaN+ NA。
> Inf-NaN
[1] NaN
> NA+Inf
[1] NA
> Inf-NA
[1] NA
> NaN+NA
[1] NaN
> NA+NaN
[1] NA
17、已知有如下命令:> my.matrix <- matrix(1:20, nrow = 4),请计算下列命令的结果。
my.matrix[2,c(1,2)]
my.matrix[2,c(2,4)]
> my.matrix <- matrix(1:20, nrow = 4)
> my.matrix[2,c(1,2)]
[1] 2 6
> my.matrix[2,c(2,4)]
[1] 6 14
实验一
任务1:求99的平方、立方和平方根。
> 99**2
[1] 9801
> 99**3
[1] 970299
> sqrt(99)
[1] 9.949874
任务2:x=345.678,将x放入round()、signf(),使用默认值测试,并列出结果。
> x=345.678
> round(x)
[1] 346
> signif(x)
[1] 345.678
任务3:重复上一习题,将参数digits依次从-2设置到2,并列出结果。
> x=345.678
> round(x,digits = c(-2:2))
[1] 300.00 350.00 346.00 345.70 345.68
> signif(x,digits = c(-2:2))
[1] 300 300 300 300 350
任务4:x=674.378,将x放入floor()、ceil()和trunc(),使用默认值测试,并列出结果。
> x=674.378
> floor(x)
[1] 674
> ceiling(x)
[1] 675
> trunc(x)
[1] 674
任务5:重复上一习题,将x改为负值-674.378,并列出结果。
> x=-674.378
> floor(x)
[1] -675
> ceiling(x)
[1] -674
> trunc(x)
[1] -674
任务6:计算下列命令的结果
> Inf+100
[1] Inf
> Inf-Inf+10
[1] NaN
> NaN+ Inf
[1] NaN
> Inf-NaN
[1] NaN
> NA +Inf
[1] NA
> Inf-NA
[1] NA
> NaN +NA
[1] NaN
任务7:将上述数据(a-g)的执行结果用下列函数测试并列出结果。
> x<-c(Inf,NaN,NaN,NaN,NA,NA,NaN)
> is.na(x)
[1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE
> is.nan(x)
[1] FALSE TRUE TRUE TRUE FALSE FALSE TRUE
> is.finite(x)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> is.infinite(x)
[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE
实验二
任务1:参考实例ch4_ _84, 列出当月有31天的月份。
> year<-c(30,29,31,30,31,30,31,31,30,31,30,31)
> names(year)<-paste("Month",c(1:12))
> year[year==31]
Month 3 Month 5 Month 7 Month 8 Month 10 Month 12
31 31 31 31 31 31
任务2:使用系统内建数据集islands,列出排序第30和35名的岛名称和面积。
> islands[rank(islands)==30 | rank(islands)==35]
Honshu New Zealand (S)
89 58
任务3:使用系统内建 数据集islands,列出前15大和最后15大的岛名称和面积。
head(sort(islands),15)
tail(sort(islands),15)
任务4:使用系统内建数据集islands,分别列出排在奇数位和偶数位的岛名称和面积。
sort(islands)[seq(1,50,by=2)]
sort(islands)[seq(2,50,by=2)]
任务5:有如下3个向量。
x1<-c ( 10, 12, 14)
x2<-c (7,14,5 )
x3<-c( 15,3, 19)
(1)使用rbind ()将上述向量组成矩阵A1。
(2)使用cbind ()将上述向量组成矩阵A2。
(3)列出A1矩阵中[1:2, ]对应的元素。
(4)列出A1矩阵中[1:2, 2:3]对应的元素。
(5)列出A2矩阵中[, 2:3]对应的元素。
(6)列出A2矩阵中[2:2, 2:3]对应的元素。
(7)取得A1矩阵中第1行以外的矩阵元素。
(8)取得A2矩阵中第2列以外的矩阵元素。
略
任务6:将第2章实际操作题中的习题2的NBA球星5人向量组成矩阵。
score<-rbind(c(1:3),c(4:6),c(7:9),c(10:12),c(13:15))
任务7:为上一题的NBA球星数据矩阵设定行名(使用球星名字)和列名(使用场次编号)。
rownames(score)<-c("ljl","ch","chx","lxr","ldy")
colnames(score)<-c(paste("Num",c(1:3)))
任务8:使用rowSums()函数为上述球星计算总得分。
rowSums(score)
任务9:使用 rowMeans ()函数为上述球星计算平均得分。
rowMeans(score)
实验三
任务1:将家人或亲人(至少10人)的血型建立为字符向量对象,然后把该血型向量转成因子。
p <- c("A","B","AB","O","A","A","O","O","A","AB","AB","O","O")
people<-factor(p)
people
任务2:重复前一题,建立因子时,使用levels将血型类别顺序设为“A”“AB”“B”“O”。
people<-factor(p,labels=c("A","AB","B","O"))
任务3:统计(或自行假设)班上20人的考试成绩,计分方式如下所示。
A.90分(含)以上
B.80~ 89
C.70~ 79
D.60~ 69
F.60以下
请将上述数据建为有序因子,排列方式为A>B>C>D>F,并按下列要求输出结果。
A1<-factor(90:93,labels=rep("A",times=4))
B1<-factor(80:83,labels=rep("B",times=4))
C1<-factor(70:73,labels=rep("C",times=4))
D1<-factor(60:63,labels=rep("D",times=4))
F1<-factor(50:53,labels=rep("F",times=4))
grade<-factor(c(A1,B1,C1,D1,F1),levels = c("F","D","C","B","A"),ordered = TRUE)
(1)请列出成绩为B以上的人。
grade[grade>"B"]
(2)请列出成绩为F的人。
grade[grade=="F"]
(3)请使用table () 函数了解个成绩的分布。
table(grade)
实验四
任务1:请参考实例ch7_ 1,建立自己家人的数据框A1,至少5个行数据,并执行以下操作。
mit.Name<-c("励家磊","林海","陈弘旭","陈昊","李凯")
mit.Gender<-c("女","男","男","男","男")
mit.Heigh<-c(170,180,170,170,180)
mit.game<-c("Minecraft","Miner","Dota","红警","GALAGAME")
mit.age<-c(22,22,22,22,22)
A1<-data.frame(mit.Name,mit.Gender,mit.Heigh,mit.game,mit.age)
(1)请将列名分别更改为: name, gender, height。
colnames(A1)[1]="name"
colnames(A1)[2]="gender"
colnames(A1)[3]="height"
(2)请为数据框增加5个行数据。
A1=rbind(A1,c("李登宇","男","173","Minecraft",22))
略
(3)请建立另一个数据框A2,这个数据框有3个行数据,然后将A2数据框接在A1数据框的下方。
name=c("王超","僵尸羊")
gender=c("女","女")
height=c(170,173)
mit.game=c("植物大战僵尸","cs2")
mit.age=c(22,22)
A2<-data.frame(name,gender,height,mit.game,mit.age)
A1=rbind(A1,A2)
(4)请列出身高170em以上的数据。
A1[A1["height"]>170,]
任务2:请建立数据框B,这个数据框有两个字段(列数据),分别是weight 和gender, 然后将数据框B接在数据框A1的右边。
(1 )请列出性别为女性数据。
#性别已经有了
B<-data.frame(weight=c(80,80,40,50,70,62,80,60))
A1<-cbind(A1,B)
(2)请列出性别为男性,同时体重超过70kg的数据。
A1[A1["gender"]=="男"&A1['weight']>70,]
任务3:麻将是由下列数据组成的。
(1)季节,春、夏、秋、冬,各1颗。
(2)花色,梅、兰、竹、菊,各1颗。
(3)红中、发财、白板,各4颗。
(4) 1万到9万各4颗。
(5)1条到9条各4颗。
(6)1饼到9饼各4颗。
请利用上述信息建立串行。
## 不是很懂你们麻将
A1<-c("春","夏","秋","冬")
A2<-c("梅","兰","竹","菊")
A3<-c(rep(c("红中","发财","白板"),times=4))
A4<-c(rep(paste(c(1:9),"万"),times=4))
A5<-c(rep(paste(c(1:9),"饼"),times=4))
mj<-list(季节=A1,花色=A2,不知道=A3,万=A4,饼=A5)
任务4:建立一个串行A, 这个串行包含以下3个元素(可想成在某- -年,某-城市认识的朋友)。
(1 ) year :字符串。
(2) city :字符串。
(3) friend : 5个姓名字符串向量数据。
A<-list("2024-06-020","QuZhou",friend=c("ldy","ljl","ch","lk","lh"))
对串行A进行下列操作
(1)使用两种方法列出串行中friend字符串向量中第2个人的名字。
A[[3]][2]
A$friend[2]
(2)将上述串行的元素分别命名为year, city 和friend。如果之前建立时已命名,则可忽略此题。
names(A)[1:2]<-c("year","city")
(3)请分别使用“[]”、“[[]]”和“$”传回对象的内容,并理解其差异。
A["year"] #返回的是该元素的完整内容(名字、元素内容)
A[["year"]] #返回的是具体元素内容
A$"year" #返回的是具体元素内容
(4)使用负索引,只返回city和friend元素的内容。
A[-1]
(5)将串行的 city的字符串内容改成LA。
A$city="LA"
(6)为串行增加新元素( 可自行发挥),此元素有3个数据。
A$"age"<-c(22,22,22)
(7)请自行建立串行B,这个串行内容可自行发挥,至少有3个元素数据。
B<-list(nation="China",sex=c("男","男","男"),school="qzc")
(8)将所建的串行 A和串行B合并。
c(A,B)
实验五
任务1:请将自己的姓名转成英文,可以得到3个字符串。例如:
“Hung”
“Jiin”“Kwei”
name<-"li deng yu"
name<-strsplit(name," ")
(1)请用paste ()函数,将上述字符串转成下列字符串。
a.“Hung Jiin Kwei"。
b.“Jin Kwei Hung"
name="li deng yu"
name<-paste(strsplit(name," ")[[1]][c(2:3,1)],collapse = " ")
(2)请将"Hung Jin Kwei"字符串转成"Hung"“iin”“Kwei”
name<-"Hung Jin Kwei"
name<-strsplit(name," ")
任务2:请建立5个姓名字符串数据,然后执行排序从小排到大和从大排到小。
name<-c("ldy","chx","ch","ljl","lh","lk")
name<-sort(name)
任务3:搜索state.name数据集中,字符串含"South" 的州。
state.name[grep("South",state.name)]
任务4:搜索 state.name数据集中,字符串含“M"的州,并将“M"改成“m”
state.name[grep("M",state.name)]
sub("M","m",state.name)
任务5:搜索 state.name数据集中,州名只含一个单字的州。
state.name[-grep(" ",state.name)]
任务6:搜索 state.name数据集中,州名含“A”和"M"的州。
state.name[grep("A|M",state.name)]
任务7:请建立自己国家每年人口出生数量的时间数列,共30年的数据。
可参考http://www.zyrm.com/xingming/news/3901.html
x.birth<-ts(c(41:70),start=1970,frequency = 1)
任务8:请挑选3只股票,记录每月的股票最高价格,记录5年,然后建立时间序列。
可参考http://quote.eastmoney.com/sh601607.html
"股票1"<-runif(60,30,50)
"股票2"<-runif(60,30,50)
"股票3"<-runif(60,30,50)
x<-cbind(股票1,股票2,股票3)
ts(x,start=c(2000,1,1),frequency=1)
实验六
任务1:重新设计实例ch11_ _11.R,使用3点参数,如果不输入第2个参数,将产生带1位小数的百分比。
ch11_11 <- function(x, digits = 1, ...) {
if(missing(digits)){
x <- round(x * 100, digits = 1)
paste(x, "%", sep = "")
} else {
x <- round(x * 100, digits = digits, ...)
paste(x, "%", sep = "")
}
}
ch11_11(c(0.4321,0.3421),2)
任务2:重新设计实例ch11_ 17.R,设计通用函数,使用3点参数,如果输人的是数值,默认是求平均值,如果输入的是字符,则将字符改成大写,默认函数则不变。
ch11_17<-function(x,...){
if(is.numeric(x)){
return(mean(x))
}
if(is.character(x)){
return(toupper(x))
}
}
ch11_17(c(123,423,123))
ch11_17(c("wadhai","AWDAwda"))
任务3:设计-个计算电费的通用函数,每度电费100元,如果输人的不是数值向量,则输出“输人错误,请输入数值向量”。
dianfei<-function(x){
if(is.vector(x)&&is.numeric(x)){
return(x*100)
}else{
print("输入错误,请输入数值向量")
}
}
dianfei(c(123,342))
dianfei(c("13123"))
任务4:不得使用R内建的函数,请设计下列函数。
(1) mymax ():求最大值。
(2) mymin():求最小值。
(3) myave ():求平均值。
(4) mysort():执行排序。
如果输入是非数值向量,则输出“输人错误,请输人数值向量”。
## 判断是否为数值
is<-function(x){
if(is.vector(x)&&is.numeric(x)){
return(TRUE)
}else{
print("输人错误,请输人数值向量")
return(FALSE)
}
}
## 最大值
mymax<-function(x){
if(is(x)){ ## 吐槽:为什么这代码样式既有c影子,又有python影子?
max=x[1]
for(i in c(1:length(x))) max=ifelse(max>x[i],max,x[i])
return(max)
}
}
## 最小值
mymin<-function(x){
if(is(x)){
min=x[1]
for(i in c(1:length(x))) min=ifelse(min<x[i],min,x[i])
return(min)
}
}
## 平均值
myave<-function(x){
if(is(x)){
sum=0
for(i in c(1:length(x))) sum=sum+x[i]
}
return(sum/length(x))
}
myave(c(1,2,3,4))
## 排序
mysort<-function(x){
if(is(x)){
tmp=0
for(i in c(1:(length(x)-1))){
for (j in c((i+1):length((x)))){
if(x[i]>x[j]){
tmp=x[i]
x[i]=x[j]
x[j]=tmp
}
}
}
return(x)
}
}
任务5:请设计一个计算电价的程序,收费规则如下所示。
(1)每度100元。
(2)超过300度打8折,“> 300”
(3)超过100度但小于等于300度打9折,“> 100”和“<= 300”
(4)政府机构用电按上述规则计算完再打7折。
(5)有贫困证明,按上述规则计算完再打5折。
请至少输入考虑所有状况的12个数据做测试。
jisuan<-function(x,...){
fee=x["degree"]*100
if(x["degree"]>300)fee=fee*0.8
else if(x["degree"]<=300&&x["degree"]>100)fee=fee*0.9
if(x["Gov"]==TRUE)fee=fee*0.7
if(x["Poor"]==TRUE)fee=fee*0.5
return(fee)
}
name<-c("ldy","ljl","chx","wj","lh","ch")
degree<-c(100,200,300,400,500,600)
Gov<-c(FALSE,FALSE,TRUE,TRUE,TRUE,TRUE)
Poor<-c(FALSE,FALSE,FALSE,TRUE,TRUE,TRUE)
data<-data.frame(degree,Gov,Poor)
rownames(data)<-name
apply(data,1,FUN=jisuan)
任务6:重新设计实例ch12_17.R,计算系统内建数据集state.region(第6章的6-9节曾介绍此数据集),每一区各有多少个州。
tapply(state.region,state.region,length)
任务7:使用state.x77数据集,配合state.region数据集,编写程序计算美国4大区的以下数据。
(1)人口数各是多少。
population<-state.x77[,1]
a.population<-tapply(population,factor(state.region),levels=state.region,sum)
a.population
(2)面积各是多少。
area<-state.x77[,8]
a.area<-tapply(area,factor(state.region),levels=state.region,sum)
a.area
(3)收人平均是多少。
income<-state.x77[,2]
a.income<-tapply(income,factor(state.region),levels=state.region,mean)
a.income
实验七
任务1:请重新设计实例ch13_ 1.R,并自行设定未来30天动物的出现次数,同时执行下列运算。
(1)列出各动物的最大出现次数。
> an_info<-matrix(round(runif(90,30,50)),nrow=30)
> colnames(an_info)<-c("猪","狗","励家磊")
> rownames(an_info)<-paste("Day",c(1:30),sep=" ")
> apply(an_info,2,max)
猪 狗 励家磊
50 49 50
(2)列出各动物的最小出现次数。
an_info<-matrix(round(runif(90,30,50)),nrow=30)
colnames(an_info)<-c("猪","狗","励家磊")
rownames(an_info)<-paste("Day",c(1:30),sep=" ")
apply(an_info,2,min)
(3)列出各动物的平均出现次数。
> an_info<-matrix(round(runif(90,30,50)),nrow=30)
> colnames(an_info)<-c("猪","狗","励家磊")
> rownames(an_info)<-paste("Day",c(1:30),sep=" ")
> apply(an_info,2,min)
猪 狗 励家磊
30 31 30
任务2:请重新设计实例ch13_ 1.R, 并自行设定未来30天动物的出现次数,同时请设定各动物有一天的出现次数是NA,执行下列运算。
(1 )列出各动物的最大出现次数。
## 略,结尾是
apply(an_info,2,max,na.rm=TRUE)
(2)列出各动物的最小出现次数。
## 略,结尾是
apply(an_info,2,min,na.rm=TRUE)
(3)列出各动物的平均出现次数。
## 略,结尾是
apply(an_info,2,mean,na.rm=TRUE)
任务3:请参考实例ch13_ _5.R, 用tapply ()函数,执行计算对于美国4大区的下列运算。
(1)人口数各是多少。
(2)面积各是多少。
(3)平均收入是多少。
## 上面写过了
任务4:请设计程序,此程序会要求输人姓名,然后请返回“Welcome” 和所输人的姓名。
> x<-scan(what=character())
1: 卷狗陈昊
2:
Read 1 item
> cat("welcome,",x)
welcome, 卷狗陈昊
任务5:重新输人上一个程序,但将结果输出至exer14_ 2.txt。
x<-scan()
write(x,file="D:/exer14_2.txt")
实验八
任务1.请重新设计实例ch13_ 1.R, 利用sample ()函数,在10(含)和100(含)间,自行产生30 天动物的出现次数。
an_info<-matrix(sample(c(10:100),90,replace=TRUE),ncol=3)
colnames(an_info)<-c("猪","狗","励家磊")
rownames(an_info)<-paste("DAY",c(1:30))
任务2.请利用R 语言,设计一个比大小的程序,程序执行初可先设定计算机赢的概率,其他接口与细节,可自由发挥。
print("请输入计算机赢得概率(0-100):")
x=scan()
print("请输入你的数字:")
y=scan()
z=sample(c(1:100),1)
if(z>x){
print("你赢了,计算机结果是:")
print(y-z)
}else{
print("你输了,计算机结果是:")
print(y+z)
}
任务3.请设计骰子游戏, 每次出现3组1 ~ 6间的数字,每次结束时询问是否再玩一次。
x=1
while(x==1){
print(sample(c(1:6),3,replace=FALSE))
print("输入1继续,否则退出!")
x=scan()
}
print("已退出")
任务4.请计算 iris对象花瓣以及花萼length / width的平均值。
apply(iris[,-5],2,mean)
任务5.请将 islands对象按面积大小分成10等份。
cut(islands,breaks=10,label)
任务6.重新设计实例 ch15_ _42.R, 合并符合人口数少于500万人的州并且月收入少于5000美元的州。
略
任务7. 重新设计实例ch15_ _43.R, 合并只要符合人口数少于500万人的州和月收人少于5000美元的州其中一个条件的州。
略

翻转卡片~
查看我的联系方式
如有事情
请扫一扫🔎
添加微信好友
