更完了,累似了!
一、基本数学运算
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美元的州其中一个条件的州。
略