R语言学习笔记(二)--向量,函数,集合

向量索引和subset函数

向量的名字

> height<-c(155,186,177,169)
> names(height)
NULL
> names(height)<-c('Mary','Jason','Tom','Tina')
> height
 Mary Jason   Tom  Tina 
  155   186   177   169 

另一种类似与字典创建的命名方式

> s<-c(Tony=87,Mary=92,Lisa=80,John=78,Victor=93)
> s
  Tony   Mary   Lisa   John Victor 
    87     92     80     78     93 

names(height)<-c(‘Mary’,‘Jason’,‘Tom’,‘Tina’)
本质上是调用了一个置换函数'name<-'()

向量索引

需要注意[]内是向量和负数以及逻辑型向量的情况,负数表示排除绝对值下标的索引

> x<-101:108
> x
[1] 101 102 103 104 105 106 107 108
> x[c(3,5,8)]
[1] 103 105 108
> x[-4]
[1] 101 102 103 105 106 107 108
> x[c(-2,-4,-7)]
[1] 101 103 105 106 108
> x[c(F,T,T,F,T,T,F,F)]
[1] 102 103 105 106
> x[x%%2==0]
[1] 102 104 106 108
> x%%2 # 得到一个逻辑型向量
[1] 1 0 1 0 1 0 1 0
> x%%2==0
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
> x[c(F,T)]
[1] 102 104 106 108

通过which索引也可以定位到需要的向量:

> which(x%%2==0)
[1] 2 4 6 8
> x[which(x%%2==0)]
[1] 102 104 106 108

直接利用name进行索引

> height
  Tony   Mary   Lisa Victor   John 
   180    166    160    175    172 
> height["Mary"]
Mary 
 166 
> height[c("Tony","John")]
Tony John 
 180  172 

利用索引可以单独修改,也可以批量修改

> s[1:4]<-c(80,90)
> s
  Tony   Mary   Lisa   John Victor 
    80     90     80     90     93 
> s[-2:-3]<-100
> s
  Tony   Mary   Lisa   John Victor 
   100     90     80    100    100 

subset()函数

subset(x,subset) 可以接受向量、列表、矩阵、数量框。
函数的第二个参数subset是一个逻辑型向量。
subset不返回NA

> x<-c(86,70,80,NA,90,NA)
> x[x>=85] #86 NA 90 NA
[1] 86 NA 90 NA
> subset(x,x>=85) #86 90
[1] 86 90

对于其余数据类型:

> y<-list(11:15,21:28,31:36)
> y
[[1]]
[1] 11 12 13 14 15

[[2]]
[1] 21 22 23 24 25 26 27 28

[[3]]
[1] 31 32 33 34 35 36

> subset(y,c(T,F,T)) # 选取第一行和第三行
[[1]]
[1] 11 12 13 14 15

[[2]]
[1] 31 32 33 34 35 36
==========
> m <- matrix(1:12,nrow=3)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> subset(m,c(T,F,T))
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    3    6    9   12
==========
> d <- data.frame(c1=1:5,c2=11:15,c3=21:25)  
> subset(d,c(T,F,T,F,T))
  c1 c2 c3
1  1 11 21
3  3 13 23
5  5 15 25
> subset(d,c2>13)
  c1 c2 c3
4  4 14 24
5  5 15 25

数学函数

函数一:

函数 作用
abs() 绝对值
sqrt() 平方根
log() 自然对数,也可以给出底数(base=3)
log2() 以2为底的对数
log10() 以10为底的对数
exp() 以自然对数e为底的指数函数
sin() asin() 正弦 反正弦
cos() acos() 余弦 反余弦
tan() atan() 正切 反正切
round() 四舍五入,参数digits指定小数位数,.5的数最好加上0.001

函数二:

函数 作用
floor() 向下取整
ceiling() 向上取整
trunc() 去掉小数部分得到整数

函数三:

函数 作用
factorial() 阶乘
choose(n,k) 组合数:从n个中选出k个
combn(x,k) 列出x个中选出k个的全部组合

排列数:choose(n,k)×factorial(k)

> factorial(5)
[1] 120
> factorial(0:11)
 [1]  1   1   2   6   24   120   720   5040
 [9]  40320   362880   3628800   39916800

> choose(4,2) #4个中选取2个 
[1] 6
> combn(1:5,3) # 1:5中选取3个的全部组合
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    2    2    2     3
[2,]    2    2    2    3    3    4    3    3    4     4
[3,]    3    4    5    4    5    5    4    5    5     5
> combn(c("Tony","Lisa","Mary","John"),2) #4个人中选2个
     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
[1,] "Tony" "Tony" "Tony" "Lisa" "Lisa" "Mary"
[2,] "Lisa" "Mary" "John" "Mary" "John" "John"

函数四:

函数 作用
sum() 求和
prod() 全部元素乘积
cumsum() 前k个元素累计求和(k=1…n)
cumprod() 前k个元素累计乘积(k=1…n)
cummax() 前k个元素最大值(k=1…n)
cummin() 前k个元素最小值(k=1…n)

!!!
注意理解cum一类函数的意思,最后得出的是数组不是单个数字

> x<-c(5,3,7,2,6)
> cumsum(x)   #前k个元素累计求和(k=1…n)
[1]  5  8 15 17 23
> cumprod(x)  #前k个元素累计求乘积(k=1…n)
[1]    5   15  105  210 1260
> cummin(x)   #求前k个元素中的最大值(k=1…n)
[1] 5 3 3 2 2
> cummax(x)   #求前k个元素中的最小值(k=1…n)
[1] 5 5 7 7 7

简单统计函数

函数 作用
max() 最大值
min() 最小值
range(x) 等价于c(min(x),max(x))
which.max() 最大数的下标
which.min() 最小数的下标
mean() 均值
median() 中位数
sd() 标准差standard deviation
var() 方差
summary() 对象的概括–均值、中位数、最值、四分位数
fivenum() 五数概括:五个数据:最值、四分位数数、中位数

注意range函数、summary和fivenum函数

> x<-sample(11:20,10)
> x
 [1] 15 14 17 20 16 11 12 13 18 19
 
> max(x) # 20 最大值
[1] 20
> min(x) # 11 最小值
[1] 11

> range(x) # 11 20 
[1] 11 20

> which.max(x) #最大数的下标
[1] 4
> which.min(x) #最小数的下标
[1] 6

> summary(x)#对于数组得到的是均值、中位数,最值和四分位数
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  11.00   13.25   15.50   15.50   17.75   20.00 
> fivenum(x) 
[1] 11.0 13.0 15.5 18.0 20.0
函数 作用
pmin() 多个长度相等的向量按元素逐个对比,返回所有向量第k个元素中的最小值
pmax() 多个长度相等的向量按元素逐个对比,返回所有向量第k个元素中的最大值

如果向量长度不同,会使用循环补齐,即短的向量循环成和最长的向量一边长
向量可以超过2个!!

> x <- c(11,7,13,6,15)
> y <- c(9,10,12,8,15)
> pmin(x,y)
[1]  9  7 12  6 15
> pmax(x,y) 
[1] 11 10 13  8 15
> pmin(x,10)
[1] 10  7 10  6 10
> pmax(x,10)
[1] 11 10 13 10 15

排序函数

函数 作用
sort(x) 升序或降序排列
order(x) 返回使得x升序或降序排序的下标变量

x[order(x)]等效于sort(x)

> x<-c(16,19,14,11,18,12)
> x
[1] 16 19 14 11 18 12
> sort(x) #升序
[1] 11 12 14 16 18 19
> sort(x,decreasing=T) #降序
[1] 19 18 16 14 12 11
> index <- order(x) #升序
> index
[1] 4 6 3 1 5 2
> x[index] 
[1] 11 12 14 16 18 19
> x
[1] 16 19 14 11 18 12
> rev(x) #对x中的元素取逆序
[1] 12 18 11 14 19 16

集合运算

函数 作用
union(x,y) 并集
intersect(x,y) 交集
setdiff(x,y) 差集,在x中,不在y中
setequal(x,y) 集合是否相等
unique(x) 去掉重复元素

需要注意的:

> x <- c(2,5,8,10)
> y <- c(1,2,9,5,7)
> setdiff(x,y) #差集 8 10 在x中不在y中
[1]  8 10
> setdiff(y,x) #差集 1 9 7 在y中不在x中
[1] 1 9 7
> setequal(x,y) #FALSE 判断集合是否相等
[1] FALSE
> setequal(c(3,5,9),c(5,3,9,3)) #TRUE
[1] TRUE
> unique(c(2,2,2,5,7,5,7,7)) # 2 5 7
[1] 2 5 7

判断元素是否在集合中:

函数 作用
x %in% set 返回逻辑向量,在set中的元素返回T,否则返回F
is.element(x,set) 同理返回逻辑向量
match(x,table) 返回x中的元素在table中的下标,没有找到返回NA
> set<-c(3,9,5,7,2) #set是自己定义的对象名
> 5 %in% set
[1] TRUE
> x <- c(5,6)
> x %in% set
[1]  TRUE FALSE
> is.element(x,set) #TRUE FALSE
[1]  TRUE FALSE
> # 返回一个和x的长度相同的向量,表示x中与y中
> # 元素相同的元素在y中的位置(没有则返回NA)
> match(x,set) # 3 NA
[1]  3 NA
函数 作用
toupper(x) 转换成大写字母
tolower(x) 转换成小写字母
substring(x,start,end) 获取子串
substr(x,start,end) 获取子串
strsplit(x,split) 切分字符串,split可以是一个字符、子串、正则表达式
noquote(x) 打印不带双引号的字符串,得到的是noquote类型的对象
> data <- "10001,Tony,98,82"
> strsplit(data,split=",") #得到一个列表list
[[1]]
[1] "10001" "Tony"  "98"    "82"   

> str[[1]] #获取列表的第一个组件
[1] "10001" "Tony"  "98"    "82"   

> #分隔符是一个或多个空格
> data <- "10002  Mary    95      78"
> strsplit(data,split=" +") #正则表达式 +表示1或多个
[[1]]
[1] "10002" "Mary"  "95"    "78"   

> fruit <- c("Apple","Orange","Banana")
> fruit
[1] "Apple"  "Orange" "Banana"
> noquote(fruit)
[1] Apple  Orange Banana

> fr <- noquote(fruit)
> fr
[1] Apple  Orange Banana
> class(fr) #noquote类的对象
[1] "noquote"

缺失值处理

与缺失值NA运算的结果仍然是缺失值
特例:False&NA的计算结果仍然是False

函数 作用
is.na(x) 得到逻辑向量,NA得到TRUE
na.omit(x) 去掉x【向量、矩阵、数据框】中的NA;向量是去掉NA元素,矩阵和数据库是去掉一整行
na.exclude(x) 同上
na.fail(x) x中包含NA时得到错误信息
> NA + 2 # NA
[1] NA
> sum(c(2,6,NA,9)) # NA
[1] NA
> x <- c(3,NA,5,7,NA,9)
> mean(x)
[1] NA
> mean(x,na.rm=T) #参数na.rm
[1] 6
> is.na(x)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE
> mean(x[!is.na(x)])
[1] 6

去重:

> y <- na.omit(x)
> y
[1] 3 5 7 9
attr(,"na.action")
[1] 2 5
attr(,"class")
[1] "omit"
'''
使显示更直接,把attr去掉
'''

> attr(y,"na.action")<-NULL
> attr(y,"class")<-NULL
> y
[1] 3 5 7 9
---------------------------
> na.exclude(x) #class是exclude
[1] 3 5 7 9
attr(,"na.action")
[1] 2 5
attr(,"class")
[1] "exclude"
---------------------------
> na.fail(x) #Error: 对象里有遺漏值
Error in na.fail.default(x) : 对象里有遺漏值

你可能感兴趣的:(R学习笔记,r语言)