更完了,累似了!

一、基本数学运算

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.lapplysapply 主要用于列表和向量,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美元的州其中一个条件的州。