2019-07-21日学习总结

array与循环

array

数组是矩阵的集合
array(data = NA, dim = length(data), dimnames = NULL)
维度:二维或以上
依据维度,“[]”和“,”合作进行索引 [2,3,4][]中的三个数字分别代表几行,几列,几层。
循环:apply(z,1,mean) apply(z,2,mean) apply(z,3,mean)1、2、3分别代表行、列、层三个维度。(apply循环只能对全部行,全部列,全部层进行操作)

apply循环

形式:apply(X, MARGIN, FUN, ...)
运用于规整的格式:array和dataframe
可以从维度方向考虑
apply(x,mar,FUN)

lapply与sapply循环(对list进行操作)

list无法给定维度,所以list循环要用lapply与sapply

lapply(X, FUN, ...)
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
作用于list,即对list的每一个数据结构进行操作,将每一个数据结构当做一个元素
从输入输出格式进行考虑
x <- list(1:10,2:8,5:7)

lapply返回结果为list

> x <- list(1:10,2:8,5:7)
> lapply(x,mean)###将list看做一个向量,lapply对list中的每一个元素(即数据结构)进行操作。[[1]]即为第一个元素。
[[1]]
[1] 5.5

[[2]]
[1] 5

[[3]]
[1] 6

> class(lapply(x,mean))
[1] "list"
> mean(x[[2]])
[1] 5
>## length(x)
> ###for循环
> #for()自己补上
> unlist(lapply(x,mean))###unlist将list转换为向量
[1] 5.5 5.0 6.0

用for循环操作

> ###for循环
> for (i in 1:length(x)) {
+   print(mean(x[[i]]))
+ }
[1] 5.5
[1] 5
[1] 6

sapply返回结果默认为矩阵

> y<- sapply(x,fivenum)
> class(y)
[1] "matrix"

lapply与sapply的区别,就在于返回形式不一样,若在sapply中设置‘simplify = FALSE’则与lapply结果一致sapply(x,mean,simplify = FALSE)

function()函数

function.name<-function(x){ }

> y <- function(x){
+   x+1-10
+ }

function.name 为函数的名称,如‘y’、‘f’等;
x为指定参数,可以随意指定,如‘x’、‘b’、‘c’,指定参数为什么,在后面使用函数时出现指定参数为什么;
{ }为指定具体操作。

apply(有维度)和lapply的区别

apply对有维度的数据结构进行操作(矩阵和数据框),lapply与sapply对没有维度的数据结构进行操作(列表和向量)。

lapply还可对向量操作,每个元素即为单个数值/字符。
lapply不仅生成数值,还可以创建文件。

因子(factor)

组成

level:相当于通讯录中的分组,“家人”、“朋友”、“同学”;
基本元素


image.png

正如上图,level是元素的unique

◆factor( )###创建一个factor
◆无序因子和有序因子-ordered
◆factor的意义:用于分组计算
◆可直接由label对因子进行更改
◆所有factor必须是level中的元素

◆因子顺序可决定绘图顺序

> topleft1 <- factor(topleft,ordered = TRUE)###创建factor
> topleft1
  [1] black  red    green  blue   blue   red    white  black  blue   blue   white 
 [12] red    blue   white  green  blue   black  red    green  white  orange red   
 [23] blue   green  white  white  white  red    blue   white  green  red    red   
 [34] white  blue   blue   blue   red    gold   green  red    white  blue   blue  
 [45] white  white  red    white  green  blue   gold   red    blue   green  green 
 [56] white  white  white  white  blue   blue   red    green  red    black  black 
 [67] red    white  blue   white  red    red    blue   red    red    black  black 
 [78] blue   white  red    blue   orange red    green  red    green  blue   green 
 [89] red    gold   white  black  red    black  red    green  red    red    green 
[100] blue   green  blue   red    white  black  blue   red    green  white  blue  
[111] green  red    green  blue   red    red    white  red    green  blue   blue  
[122] red    white  white  blue   orange green  white  blue   red    red    red   
[133] white  white  red    red    red    blue   white  green  red    white  blue  
[144] red    white  green  green  green  red    green  red    blue   blue   orange
[155] white  red    red    gold   white  green  blue   blue   red    green  blue  
[166] blue   red    red    blue   green  red    red    white  white  red    red   
[177] white  white  red    black  white  white  white  blue   red    black  gold  
[188] gold   red    blue   blue   green  green  green 
Levels: black < blue < gold < green < orange < red < white###显示了其level
> class(topleft1)
[1] "ordered" "factor" ###有序的因子
> levels(topleft1)###查看level
[1] "black"  "blue"   "gold"   "green"  "orange" "red"    "white" 

设定level

把原来的level顺序打乱

> levels <- sample(levels(topleft1),length(levels(topleft1)))
> levels
[1] "green"  "gold"   "black"  "red"    "blue"   "white"  "orange"

sample()随机抽样函数

> topleft2 <- factor(topleft,levels=levels,ordered = TRUE)##顺序代表一定意义
> levels(topleft2)
[1] "green"  "gold"   "black"  "red"    "blue"   "white"  "orange"

在因子中添加元素

必须要先在level中添加,才能在factor中添加元素;添加的元素若不在level中会生成NA。

> levels(topleft3)<- c(levels(topleft3),'pink')
> topleft3[1] <- 'pink'

删掉冗余的level

如果对某一因子进行改变,导致某一level没了,则可通过droplevels这一函数删除这一level,而非直接对level操作。

> topleft3[1] <- 'black'
> unique(topleft3)
[1] black  red    green  blue   white  orange gold  
Levels: black blue gold green orange red white pink
> topleft3<- droplevels(topleft3)
> levels(topleft3)
[1] "black"  "blue"   "gold"   "green"  "orange" "red"    "white" 

通过对label进行设定,可直接更改factor

> topleft4 <- factor(topleft,levels=levels,labels=seq(1,length(levels),1))###设置levels
> topleft4
  [1] 3 4 1 5 5 4 6 3 5 5 6 4 5 6 1 5 3 4 1 6 7 4 5 1 6 6 6 4 5 6 1 4 4 6 5 5 5 4 2 1 4
 [42] 6 5 5 6 6 4 6 1 5 2 4 5 1 1 6 6 6 6 5 5 4 1 4 3 3 4 6 5 6 4 4 5 4 4 3 3 5 6 4 5 7
 [83] 4 1 4 1 5 1 4 2 6 3 4 3 4 1 4 4 1 5 1 5 4 6 3 5 4 1 6 5 1 4 1 5 4 4 6 4 1 5 5 4 6
[124] 6 5 7 1 6 5 4 4 4 6 6 4 4 4 5 6 1 4 6 5 4 6 1 1 1 4 1 4 5 5 7 6 4 4 2 6 1 5 5 4 1
[165] 5 5 4 4 5 1 4 4 6 6 4 4 6 6 4 3 6 6 6 5 4 3 2 2 4 5 5 1 1 1
Levels: 1 2 3 4 5 6 7
> levels(topleft4)
[1] "1" "2" "3" "4" "5" "6" "7"

拆分与循环(split与tapply)

◆分组计算,结合因子使用(将因子拆分成不同小组,分组计算)
◆因子与待拆分内容应长度一致
◆不同因子用list进行承载

拆分(split)

split(x, f, drop = FALSE, ...)
◆分组,结合因子f使用
◆因子f与待拆分x内容应长度一致
◆不同因子用list进行承载
◆drop表示,是(TRUE)否(FALSE)弃掉不存在的level

> total_s<- split(flag,flag$topleft)
> class(flag$topleft)
[1] "character"

flag是待分组数据,flag$topleft是分组依据,split函数会自动把分组依据转化为factor

> class(total_s)返回结果为列表
[1] "list"
> length(total_s)
[1] 7

返回结果为列表(每个分组中各元素数量不一致)

split还可以这样用,可以是独立的长度一致的数据(不一定非得是同一数据文件里的列)
> split(flag$landmass,flag$topleft)
> split(1:10,rep(1:2,times=5))
$`1`
[1] 1 3 5 7 9

$`2`
[1]  2  4  6  8 10
list将多个分类因子结合起来(即依据多个因子对数据进行分组,如依据性别和年龄,将性别和年龄组合起来,“男性20岁以下的”)
> unique(flag$zone)
[1] 1 3 2 4
> unique(flag$topleft)
[1] "black"  "red"    "green"  "blue"   "white"  "orange" "gold"  
> split(flag$landmass,list(flag$zone,flag$topleft))
$`1.black`
[1] 5 3 3 3 5 4 4

$`2.black`
[1] 4 6

$`3.black`
integer(0)

$`4.black`
[1] 1 2 1

$`1.blue`
 [1] 3 5 4 4 3 3 5 3 5 6 6 5 5 6 3 4 3 5 3

$`2.blue`
[1] 4 6 6 4

$`3.blue`
[1] 6 2 2 2 6

$`4.blue`
 [1] 1 1 1 1 1 1 2 1 1 3 4 1 1 1 1
unlist将列表转化为向量
> split(1:10,rep(c(1,2),times=5))
$`1`
[1] 1 3 5 7 9

$`2`
[1]  2  4  6  8 10

> unlist(split(1:10,rep(c(1,2),times=5)),use.names = F)
 [1]  1  3  5  7  9  2  4  6  8 10
> unlist(split(1:10,rep(c(1,2),times=5)))
11 12 13 14 15 21 22 23 24 25 
 1  3  5  7  9  2  4  6  8 10 

tapply函数,在split基础上兼容了函数的操作(在分组内容里进行)

> tapply(flag$landmass,flag$topleft,mean)
   black     blue     gold    green   orange      red    white 
3.416667 3.255814 2.500000 3.625000 4.500000 3.982143 3.414634 
> tapply(flag$landmass,flag$topleft,fivenum)
$black
[1] 1.0 2.5 3.5 4.5 6.0

$blue
[1] 1 1 3 5 6

$gold
[1] 1 2 2 3 5

$green
[1] 1.0 3.5 4.0 4.0 5.0

$orange
[1] 4.0 4.0 4.5 5.0 5.0

$red
[1] 1 3 4 5 6

$white
[1] 1 2 3 5 6

while

 break 跳出当前循环,传递至该循环的上一级(无上一级即直接跳出);
 next 停止执行当前循环,执行下一次循环;
 break 和 next 均嵌套于循环之内;

熟悉会产生什么结果,创建相应大小的数据结构(向量或矩阵)

> i <- 1### i 代表的是个数
> #####熟悉会产生什么结果,创建相应大小的数据结构
> tmp <- c()##创建一个向量
> tmp <- matrix(NA,20,10)###创建相应行列的矩阵
> while (i <=6) {
+   tmp[i]<- letters[i]
+   i = i+1####要有这种设置,才会对i产生改变,才不会是死循环
+ }

break 满足条件跳出循环

> a<-while (i <= 6) {
+   if (i==4)
+   print(letters[i])
+   i = i+1
+ }
[1] "a"
[1] "b"
[1] "c"

next 挑出当前执行下一数值操作

> x <- 1:5
> for (val in x) {
+   if (val == 3){
+     next
+   }
+   print(val)
+ }
[1] 1
[1] 2
[1] 4
[1] 5

ifelse

 if(cond) expr
 if(cond) cons.expr else alt.expr 处理的是一个逻辑值,得到一个输出
 ifelse(cond, cons.expr, alt.expr) 处理一串逻辑值,得到一串输出

if(cond) cons.expr else alt.expr 处理的是一个逻辑值,得到一个输出

> a <- 1:10
> if (a<5) { 
+   print('small')
+   }else if (a>5&a<=7) { 
+   print('medium')
+   }else {
+   print('big')}###只对第一个逻辑值起作用
[1] "small"
Warning message:
In if (a < 5) { :
  the condition has length > 1 and only the first element will be used

felse(cond, cons.expr, alt.expr) 处理一串逻辑值,得到一串输出

> ifelse(a<5,'small','big')
 [1] "small" "small" "small" "small" "big"   "big"   "big"   "big"   "big"   "big"  

生成1:20的数据,使用ifelse循环,x<=8输出‘small’,8<x<=15输出‘medium’,15<x<=20输出“big”

> tmp <- 1:20
> b <- ifelse(tmp<=8,'small',ifelse(tmp<=15,'medium','big'))
> b
 [1] "small"  "small"  "small"  "small"  "small"  "small"  "small"  "small"  "medium"
[10] "medium" "medium" "medium" "medium" "medium" "medium" "big"    "big"    "big"   
[19] "big"    "big"   

数据处理

集合操作

image.png

setdiff(A,B)取A中有B中没有的
setdiff(B,A)取B中有A中没有的

排序

◆sort 直接返回排序结果
◆rank 返回向量中对应元素的秩(rank)即排名(返回默认为从小到大排序后的对应元素的排名)
◆order 返回的是升序或降序对应的排列,可作用于多个向量(位置)(返回默认为从小到大排序后对应元素在原来未排序之前的数据中的位置)

排序
> tmp
[1] 5 6 8 4 2
> sort(tmp)###排序方式默认为从小到大
[1] 2 4 5 6 8
> rank(tmp)###原数据中各对应元素的排名
[1] 3 4 5 2 1
> order(tmp)###该元素按默认从小到大排序后在原数据中的位置
[1] 5 4 1 2 3

order中让其按降序排列的话就用“-”
order(-iris$Sepal.Length)###另类的设置方式

f<- sample(1:20,7)
sort(f)###返回的是排序后的数值
order(f)###返回的是,output中的数据应来源于input的哪个位置
rank(f)###返回的是input的排名

依据两个向量排序

>order(iris$Species,iris$Sepal.Length)###两个字段排序,以iris$Species进行排序,再在iris$Species范围内按从小到大或从大到小排序。
>order(iris$Species,-iris$Sepal.Length)###‘-’代表降序

如何生成按要求排序后的数据(索引+order)

> a<- iris[order(iris$Species,iris$Sepal.Length),]
> a
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
14           4.3         3.0          1.1         0.1     setosa
9            4.4         2.9          1.4         0.2     setosa
39           4.4         3.0          1.3         0.2     setosa
43           4.4         3.2          1.3         0.2     setosa
42           4.5         2.3          1.3         0.3     setosa
4            4.6         3.1          1.5         0.2     setosa
7            4.6         3.4          1.4         0.3     setosa
23           4.6         3.6          1.0         0.2     setosa
48           4.6         3.2          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
30           4.7         3.2          1.6         0.2     setosa
12           4.8         3.4          1.6         0.2     setosa
13           4.8         3.0          1.4         0.1     setosa

rank

> rep(1,10)
 [1] 1 1 1 1 1 1 1 1 1 1
> rank(rep(1,10),ties.method='average')###取rank的平均值
 [1] 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5
> rank(rep(1,10),ties.method='first')###按出场先后顺序
 [1]  1  2  3  4  5  6  7  8  9 10
> rank(rep(1,10),ties.method='last')###按出场顺序逆序
 [1] 10  9  8  7  6  5  4  3  2  1
> rank(rep(1,10),ties.method='min')###取最小的排序位置
 [1] 1 1 1 1 1 1 1 1 1 1

字符操作

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

常用字符含义

a <- c('Hello','somebody',
       'say','The',
       '4 new','cars',
       'parked','in','the',
       'garage','oops','cat',' ')
grep('[^c]ar',a)###[^]取反
grep('[^c]ar',a,value = T)
grep('[^T]he',a,value = T)
grep('o',a,value = T)
grep('o{2}',a,value = T)###{}匹配次数设置
grep('oo',a,value = T)
grep('o{1,2}',a,value = T)
grep('s',a,value = T)
grep('s$',a,value = T)##前面字符位于字符尾部
grep('t',a,value = T)
grep('^t',a,value = T)###后面字符位于字符首位
grep('\\d',a,value = T)###\d表示数字
grep('\\D',a,value = T)###\D表示非数字
grep('\\w',a,value = T)###\w表示字母、数字、下划线[A-Za-z0-9_]
grep('\\W',a,value = T)###\W表示匹配非字母、数字、下划线
grep('\\s',a,value = T)###\s匹配空白字符
grep('\\S',a,value = T)###\S匹配非空白字符

字符操作

 grep返回位置
 grepl返回逻辑值
 gsub进行全局替换(global)
 sub只替换第一个
 nchar 进行字符的长度统计
 substr 进行字符内容的替换
 strsplit 字符拆分
✓ pattern 正则表达式代表的内容或字符串
✓ x 字符向量
✓ replacement 用来替换的内容
✓ value=T 返回匹配结果,否则返回位置信息
✓ fixed pattern非正则表达式内容
✓ invert 返回不匹配的部分

`

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容