r入门练习(三)

来源:互联网 发布:sql insert 语法 编辑:程序博客网 时间:2024/05/22 11:38

R语言学习,后更答案。


第七章 字串符和因子

7.1   字符串

字符向量中的每个元素都是字符串,文本的基本单位是字符向量。字符向量可用c 函数创建。我们可以用单引号或双引号把字符串引用起来,只要引号之间匹配即可paste函数能将不同字符串组合在起来,参数sep可以更改分隔符,paste0函数可去掉分隔符。collapse 参数可把结果收缩成一个包含所有元素的字符串:

paste( c( "red","yellow") , "lorry", sep = "- ")

past e( c( "red","yellow") , "lorry", collapse = ", ")

past e0( c( "red","yellow") , "lorry")

toString函数是paste的变种,可限制打印的数量。例如width = 40将输出限制为40个字符

 

7.2   格式化数字

format C可指定使用固定型或科学型的格式、小数的位数以及输出的宽度。

format C( powers_of _e, digits = 3) #指定三个数字

format C( powers_of _e, digit s = 3, wi dt h= 10) #前面加上一个空格

sprint的第一个参数指定了一个格式化字符串,其中包括其他值的占位符。%s代表另一个字符串,%f 和%e 分别代表固定型格式和科学型格式的浮点数,%d 表示整数

 

7.3   特殊字符

可以通过\ t 插入一个制表符。注意要使用cat 而非print,因为pr int 执行的额外的转换动作会把制表符\ t 转换成反斜杠和一个“t.”。将光标移动到下一行是通过打印换行符\ n完成的

cat ( "f oo\ nbar ", fill = TRUE)

空字符\ 0 用于终止字符串。打印反斜杠符时需要连续输入两个反斜杠符,以免被误认为特殊字符,但打印时只会看到一个。使用双(单)引号,那么双(单)引号符前必须加一个反斜杠来转义:

cat ( "f oo\ "bar ", fill = TRUE)

与之相反,如果在被双引号引用的字符串中使用单引号,或在被单引号引用的字符串中使用双引号,则并不需要对其进行转义:

cat ( ' f oo"bar ' , fil l = TRUE)

 

7.4 更改大小写,截取、分割字串符

使用toupper和tolower函数能把字符串中的字符全部转换为大写或小写

截取子串:substring和substr,strsplit用于分割

 

7.5因子

因子是一个用于存储类别变量的特殊的变量类型。它有时像字符串,有时又像整数。可以通过指定levels参数来更改因子被创建时水平的先后顺序,若创建之后再改变则用factor函数。droplevels函数可用于删除因子水平

 

7.6   连续变量与类别变量之间的转换

一个汇总数值变量的方法是计算有多少个值落入不同的“组”(bins)中,cut 函数能将数值变量切成不同的块,然后返回一个因子。它通常使用 table 函数得到每组数字的总和,使用Beta产生类别

与上面相反的情况是把因子转换成数值变量。为了正确地把因子转换为数字,可先把因子转换为字符向量,再转换为数值。

 

7.7   生成因子水平

可用gl 函数来生成因子。它最简单的形式是:第一个整型参数为要生成的因子的水平数,第二个为每个水平需要重复的次数

gl ( 3, 2)

 

7.8   合并因子

如果我们有多个类别变量,有时把它们合并成一个单一的因子是有用的,其中每个水平由各个变量之间的交叉合并(使用interaction 函数)组成:

treatment <- gl ( 3, 2, labeIs = c("placebo", "drug A", "drug B") )

gender <- gl ( 2, 1, 6, labels = c("female", "male") )

interaction( treatment , gender )

 

 

 

第8章 流程控制与循环

8.1 if和else

i f 接受一个逻辑值(更准确地说是一个长度为1的逻辑向量)作为参数,且当该值为TRUE时才会执行下一条语句:

if(TRUE) message("It was true!")

If(FALSE) message("It wasn'ttrue!")

if的条件中不允许缺失值,这样做会抛出一个错误:

if(NA) message("Who knows if it wastrue?")

## Error:missing value where TRUE/FALSEneeded

当然,大部分时候你都不会直接传入TRUE或FALSE值,而是传递一个变量或表达式.在下例中,runif(1)将在0和1 之间生成一个均匀分布的随机数。如果该值超过0.5,则显示以下消息:

if(runif(1) > 0. 5) message("Thismessage appears with a 50% chance.")

与if对应的是else语句.如果if的条件值为FALSE,则会执行else之后的代码:

if(FALSE)

{

message("Thiswon't execute...")

} else

{

message("butthis will.")

}

注意:else必须与i f 语句的右大括号紧接在同一行

 

与很多其他的语言不同,R有一个小技巧能对你的代码重新排序来完成条件赋值。在下例中,Re 将返回复数实部(I m将返回虚部):

x <- sqrt(-1+0i)

(reality <- if(Re(x) ==0)"real"else"imaginary")

 

8.2.1矢量化的if

由于R几乎都是矢量化的,你大概不会惊讶于矢量化的流程控制的存在,例如ifelse函数。ifelse有三个参数:第一个是逻辑条件向量;第二个参数值在第一个向量为TRUE时被返回;第三个参数值在第一个向量为FALSE时被返回。在下例中,rbinom使用二项分布生成随机数以模拟掷硬币过程:

ifelse(rbinom(10,1,0.5),"Head","Tail")

如果条件参数中有缺失值,那么结果中的相应位置也是缺失值:

yn[c(3,6,9,12)] <- NA

ifelse(yn,1:3,-1:-12)

 

8.2.2多个分支

如果包含太多的else语句就会迅速降低代码的可读性。在这种情况下,可以用switch函数来美化它们。它的常见用法是:第一个参数为一个返回字符串的表达式,其后的参数为与第一个参数相匹配时的返回值。匹配参数必须与第一个参数完全一样(从R的2.11.0版本开始),且你可以使用大括号来执行多个表达式:

(greek <- switch(

"gamma",

alpha= 1,

beta =sqrt(4) ,

gamma=

{

a <- sin(pi/3)

4*a^2

}

))

如果找不到任何匹配的名字,那么switch将(隐式地)返回NULL:

(greek <- switch(

"delta",

alpha= 1,

beta =sqrt(4) ,

gamma=

{

a <- sin(pi/3)

4*a^2

}

))

 

8.3.1重复循环

R 中最容易掌握的循环是repeat,以下的例子将反复执行,直到你按下Escape键、退出R或世界末日降临为止:

repeat

{

message("HappyGroundhog Day!")

}

break 语句可以让代码跳出无限循环在下例中,sample函数将在每个循环迭代中返回一个操作:

repeat

{

message("HappyGroundhog Day!")

action<- sample(

c(

"Learn French",

"Make an ice statue",

"Rob a bank",

"Win heart of Andie McDowell"

) ,

1

)

message("action = ",action)

if(action == "Win heart of Andie McDowell")break

 

8.3.2 while循环

whi le 循环它不是先执行代码再检查循环是否应该结束,而

是先进行检查再(可能)执行代码。因为检查发生在开始时,所以循环体有可能不会被执行(与 r epeat 循环不同)。在下例中,与以上repeat的例子类似,除了当“Win heart of Andie McDowell”被抽中了,剩下的GroundhogDay 循环语句则可完全避免:

action <- sample(

c(

"Learn French",

"Make an ice stat ue",

"Roba bank",

"Win heart of Andie McDowell "

) ,

1

)

while(action! = "Win heart of AndieMcDowell")

{

message("HappyGroundhog Day! ")

action<- sample(

c(

"Learn French",

"Make an ice statue",

"Rob abank",

"Win heart of Andie McDowell "

) ,

1

)

message("action= ",action)

}

 

8.3.3

第三种循环适用于已知代码所需执行的循环次数的情形。for循环将接受一个迭代器变量和一个向量参数。在每个循环中,迭代器变量会从向量中取得一个值。最简单的情况下,该向量只包含整数:

for(iin1:5) message("i = ",i)

 

练习7:

1.构造两个新的字符串,一个元素为air,tian,kong,另一个元素为an,把两个字符串组合起来,并把分隔符改为.

2.把上述两个字符串收缩成一个字符串,打印向量时限制打印数量为10

3.构造一个名为int的函数,元素有1至6,用exp函数计算int中的数,将结果构成一个名为ant的函数,用C语言的格式化风格,并限定结果为两位数字

4.在字符串fat woe中加入一个双引号

5.如何查找R的工作目录并改变它的位置

6.如何查询因子水平和水平的级数

7.创建一个名为baby_age的数据框,一行名为age,元素为3,4,2,1,5,一行名为weight,元素为5.3,6.5,5.2,4.4,NA 并去掉元素中的NA

8.如何将因子按一定顺序排列

9.用paste函数输入蓝色,绿色,黄色,粉色糖果且用“@”作为分隔符,字串符用$连接

10.用toString函数打印数列x=(7:777)^1/2的前77个字符

 

 

练习8:

1.执行语句:当sqrt(6)小于3时,则显示F,大于3时则显示T

2.如何测试条件中是否含有缺失值

3.创建一个向量,元素为4+2i,条件为实部为3,使其输出为T,否则就输出为F

4.repeat函数的作用是什么,要如何终止循环

5.如何把repeat循环变成while循环

6.用while循环语句做出下列语句

[1] 5 5 5 5 5

[1] 4 4 4 4

[1] 3 3 3

[1] 2 2

[1] 1

7.什么情况下用for循环比较适合

8.什么时候可以用switch函数,它的常用用法是什么

9.在使用if语句时应该注意else的位置应该在哪里

 

 

 

 

练习9:

1.生成6个不同的0到1的随机向量

9.2 用lappy函数做出下列语句

[[1]]

[1] 6

 

[[2]]

[1] 6 6

 

[[3]]

[1] 6 6 6

 

[[4]]

[1] 6 6 6 6

 

[[5]]

[1] 6 6 6 6 6

 

[[6]]

[1] 6 6 6 6 6 6

3创建一个行数为6的方阵,并计算每行的总数和每列的平均数

4当一个标量作为输入参数,如何返回一个新的接受向量的函数

5.创建一个名为one的数据框,一列名为run,元素有Tom,Dick,Hat,用循环语句分别循环3,2,4次;一列名为jump,元素同run,分别循环4,2,3次;一列名为score1(对应run),用对数正态分布,观察数为9,对数平均为6,标准差为2,一列名为score2(对应jump),条件同score1,并计算每个人在run和jump的平均得分

6 laplry函数和sapply函数有什么不同

7.用raply函数得出5个服从标准正态分布的数,并返回列表和数据框

8.ddply函数可以替换哪个函数,优点是什么,如何调用函数应用于ddply的每一列和特定的一列

9.如何测试条件中的缺失值

10.使用state.x77的数据包,并计算其方差和平均值。

11.如何遍历树状数据?

 

原创粉丝点击