0
点赞
收藏
分享

微信扫一扫

非数值型数据

小亦同学321 2022-02-01 阅读 51
r语言

首先是逻辑值

FALSE或TRUE,只有这两者对象。逻辑值在所有编程语言中都会出现 ,并且有许多重要的用途。

1.判断FALSE or TRUE

可缩写为F或T(这意味着对象不可被命名为T或F)

矩阵(和其他更高维数组)也可以由逻辑值组成。

2.逻辑值的输出:关系运算符

> X<-matrix(data=x,nrow=7,ncol=10,byrow=T)
> X
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[4,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[5,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[6,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
[7,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
> 1==2
[1] FALSE
> 1+6==7
[1] TRUE
> 1-2==(-1)
[1] TRUE
> c1<-c(1,6,4,7,9,8,4445,14,77)
> c2<-c(4,888,7,999,45,123456789)
> length(c1)==length(c2)
[1] FALSE
> c1<c2
[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
Warning message:
In c1 < c2 : 长的对象长度不是短的对象长度的整倍数
> c1<(c2+100000)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Warning message:
In c1 < (c2 + 1e+05) : 长的对象长度不是短的对象长度的整倍数#可用于检查

逻辑值也可用于向量的循环。

例如,> c1<=789456
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

> c3<-c(852,963)
> c1>c3
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
Warning message:
In c1 > c3 : 长的对象长度不是短的对象长度的整倍数
> c3<-c(852,963,412)
> c1>c3
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE

我们可以用any和all可以快速查看逻辑值。如果向量中有至少一个逻辑值是TRUE,那any函数返回TRUE。如果有一个不是TRUE,那all函数返回FALSE。

理解diag函数的材料:

> diag(diag(10)==0)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> diag(10)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    0    0    0     0
 [2,]    0    1    0    0    0    0    0    0    0     0
 [3,]    0    0    1    0    0    0    0    0    0     0
 [4,]    0    0    0    1    0    0    0    0    0     0
 [5,]    0    0    0    0    1    0    0    0    0     0
 [6,]    0    0    0    0    0    1    0    0    0     0
 [7,]    0    0    0    0    0    0    1    0    0     0
 [8,]    0    0    0    0    0    0    0    1    0     0
 [9,]    0    0    0    0    0    0    0    0    1     0
[10,]    0    0    0    0    0    0    0    0    0     1
> diag(10)==0
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
 [1,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [2,]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [3,]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [4,]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [5,]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
 [6,]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
 [7,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
 [8,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
 [9,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
[10,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
> any(diag(diag(10)==0))
[1] FALSE
 

3.多重比较:逻辑运算符

逻辑值还用于检验是否满足多个条件。

接下来,基于AND和OR语句的逻辑运算符,啦比较TRUE或FALSE对细想。

版本,“单值比较”和“元素比较”

操作符号

优先顺序

c1和c2都是R中两个向量,c1&&c2,c1||c2意味着只比较两向量的第一对元素。

练习题

> foo<-c(7,1,7,10,5,9,10,3,10,8)
> foo>5|foo=2
Error in foo > 5 | foo = 2 : 没有"|<-"这个函数
> (foo>5)|(foo=2)#注意括号
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> (foo>5)|(foo==2)
 [1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE

> bar<-c(8,8,4,4,5,1,5,6,6,8)
> ((bar<6)|(bar==6))&&(bar!=4)
[1] FALSE
> ((bar<6)|(bar==6))&(bar!=4)
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

((foo>5)|(foo==2))&((bar<=6)&(bar!=4))#还可以这样运算?
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE

(baz>=14)&(baz!=15)
##(ii)
(baz/foo>4)|(baz/foo<=2)
与以下功能相同

> ((baz>14)|(baz==14))&(baz!=15)
 [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE
> baz2<-baz/foo
> (baz2>4)|(baz2<=2)
 [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  

4.逻辑值也是数值

逻辑值和数值是可以相互替换的。

> 1&&1
[1] TRUE
> 1||0
[1] TRUE
> 0&&1
[1] FALSE

这意味着我们可以对逻辑值使用各种函数

5.利用逻辑值提取子集——不需要事先知道元素的位置

逻辑标志向量,如果逻辑标志向量的元素是TRUE,那么与之对应的元素将被提取出。

例如,

> c<-(5,-6,8,99,78,2,60,94,-10,5,-12)
错误: 意外的',' in "c<-(5,"
> c<-c(5,-6,8,99,78,2,60,94,-10,5,-12)
> c<0#此执行后产生的是一个标志向量!
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
> c1<-c[(c<0)]
> c1
[1]  -6 -10 -12

示例,c2<-c[c(T,F)]

> c2<-c[c(T,F)]
> c2
[1]   5   8  78  60 -10 -12
 

c3<-c[(c>0)&(c<20)]

> c3<-c[(c>0)&(c<20)]
> c3
[1] 5 8 2 5
 

也可以通过逻辑标志向量重写特定元素

c4<-(c[c<0]<-200)

> c4<-(c[c<0]<-200)
> c4
[1] 200
> c
 [1]   5 200   8  99  78   2  60  94 200   5 200
但不能直接使用负逻辑标志向量来删除特定的元素,只有使用数值索引向量时才可以。

which

>  c<-c(5,-6,8,99,78,2,60,94,-10,5,-12)
> c5<-(c<0)
> c5
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE
> which(x=c5)
[1]  2  9 11

可以简化:

which(c<0)

执行

> which(c<0)
> which(c<0)
[1]  2  9 11


解读:which函数将逻辑值向量作为参数x,并返回所有TRUE元素对应的位置索引值。

也可以将这种方法用于其他形式的提取。

which函数可以在逻辑标志向量的基础上删除元素。我们可以用其来删除或者改写为负数元素的索引值。

c[-which(c<0)]

> c[-which(c<0)]
[1]  5  8 99 78  2 60 94  5
A[1,2:3]功能与A[c(T,F,F),c(F,T,T)]功能相同

A[A<1]<--7,这种情况下,标志矩阵与目标矩阵的行数和列数相同,因此标志矩阵提供了所有相关的结构信息。

which函数在处理二维或多维数据时要更加小心。

which(x=A>25)

which(x=c(A[,1],A[,2],A[,3])>25)

特别是在处理高维数组时,

which(x=A>25,arr.ind=T)

二、字符

字符串是另外一种常见的数据类型,用于表示文本。

R语言,字符串经常用于制定文件夹位置或软件选项;

将一个参数传递给函数;

注释存储对象,提供文本输出,或帮助解释图形。

它们可以简单地通过构造分类变量来定义不同的组,正如我们将看到的,因子更适合分类。

字符串格式

?regex

R环境中

本书中

1.创建一个字符串

foo<-"This is a character string!"

> foo<-"This is a character string!"
> foo
[1] "This is a character string!"
R将字符串作为单一的实体。——R计算的是不同字符串的总数,而不是单独字符或单词。

nchar函数

> nchar(foo)
[1] 27
> nchar(x=foo)
[1] 27
包括数字在内的几乎任何字符串组合都可以是一个有效字符串。

在这种格式下,字符串没有数字上的含义。示例:

> x<-"23.3"
> x
[1] "23.3"
> x*2
Error in x * 2 : 二进列运算符中有非数值参数

字符串常见的一个用途是比较大小:按照字母表顺序,排在后面的数字被认为更大。大写字母被认为是大于小写字母。大多数符号可以在一个字符串中同时使用。

"\"是一个重要的特例——转义符号——当一个字符串的引号内使用反斜杠时,会开始执行一些简单的操作,比如打印或者显示字符串本身。

2.连接

cat与paste两者之间的区别和各自的作用。

> u<-c("awesome","R","is")
> length(u)
[1] 3
> u
[1] "awesome" "R"       "is"     
> cat(u[2],u[3],"totally",u[1],"!")
R is totally awesome !> 
> paste(u[2],u[3],"totally",u[1],"!")
[1] "R is totally awesome !"
 

可选参数seq

> paste(u[2],u[3],"totally",u[1],"!",seq="---")
[1] "R is totally awesome ! ---"
> paste(u[2],u[3],"totally",u[1],"!",sep="---")
[1] "R---is---totally---awesome---!"
> paste(u[2],u[3],"totally",u[1],"!",sep="")
[1] "Ristotallyawesome!"
必要时可以手动插入空格。

连接是非常有用

双引号之中用单引号

3.转义序列

\nnewline
\rcarriage return
\ttab
\bbackspace
\aalert (bell)
\fform feed
\vvertical tab
\\backslash \
\'ASCII apostrophe '
\"ASCII quotation mark "
\`ASCII grave accent (backtick) `
\nnncharacter with given octal code (1, 2 or 3 digits)
\xnncharacter with given hex code (1 or 2 hex digits)
\unnnnUnicode character with given code (1--4 hex digits)
\UnnnnnnnnUnicode character with given code (1--8 hex digits)

R: Quotes
http://127.0.0.1:10817/library/base/html/Quotes.html

转义序列用来控制格式和字符串的间距,而不是普通文本。

getwd()

setwd()

使用getwd打印当前的工作目录并通过setwd去修改它,分隔文件夹必须使用一个斜杠(/),而不是一个反斜杠。

setwd("/folder1/folder2/folder3/")

4.子集与匹配

模式匹配可以从给定的字符串中识别出较短的字符串。

substr(x=foo,start=21,stop=27)

sub函数,gsub函数,pattern

示例:

三、因子

1.R中,因子用于表示不同类别的有限数据,而不是用于表示连续数据。像这样的分类数据系刑事在数据科学中发挥着重要的作用。

表示每个人名字的唯一方式

性别

因子创建元素

可填充类型

唯一形式

命名

factor

工作方式

额外信息——最重要额外信息:levels函数

另外levels的作用(相当于赋值)

firstname[]

2.水平的定义与排序

3.组合与分割

cut

练习已保存至第一部分练习.第四章的练习(通过对比标准答案学习了很多)

举报

相关推荐

0 条评论