2021-03-09 D7 tidyverse、stringr、条件和循环

tidyverse_代码在01.tidyr.R

R包和数据准备:

rm(list = ls())
options(stringsAsFactors = F)
if(!require(tidyr))install.packages("tidyr")
library(tidyr)

首先要数据清理,tidydata每个变量(variable)占一列,每个观测(observation)占一行。

tidyr 核心函数

一、数据清理

原始数据

test <- data.frame(geneid = paste0("gene",1:4),
                 sample1 = c(1,4,7,10),
                 sample2 = c(2,5,0.8,11),
                 sample3 = c(0.3,6,9,12))
test

扁变长

test_gather <- gather(data = test,
                    key = sample_nm,
                    value = exp,
                    - geneid)
head(test_gather)

长变扁

test_re <- spread(data = test_gather,
                key = sample_nm,
                value = exp)
head(test_re)

二、分割和合并

原始数据: test <- data.frame(x = c( "a,b", "a,d", "b,c"));test

1.分割

test_seprate <- separate(test,x, c("X", "Y"),sep = ",");test_seprate

2.合并

test_re <- unite(test_seprate,"x",X,Y,sep = ",")

三、处理NA

原始数据: X<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
X[2,2] <- NA
X[4,1] <- NA


image.png

1.去掉含有NA的行,可以只根据某一列来去除

drop_na(X)

image.png

drop_na(X,X1)
image.png

drop_na(X,X2)
image.png

XX2 = replace_na(XX2, 0)
image.png

fill(X,X2):用上一行的值填充NA
image.png

完整操作,查看小抄https://www.rstudio.com/resources/cheatsheets/

dplyr-五个基础函数 代码在02_dplyr.R

1.mutate()新增例

test = mutate(test, new = Sepal.Length * Sepal.Width) #要赋值,test才会变
image.png

2.select()按列筛选

3.filter()按行筛选

4.arrange(),按照数据框的某一列或者某几列给数据排序,功能强大

arrange(test, Sepal.Length)#表示按照test数据框的Sepal.Length这一列默认从小到大排序
arrange(test, desc(Sepal.Length))#desc表示从大到小排序
arrange(test, desc(Sepal.Width),Sepal.Length)#先按照desc(Sepal.Width)列排,如果desc(Sepal.Width)A列相同,按照Sepal.Length列排

5.summarise() 汇总

关系数据:即将2个表进行连接,注意:不要引入factor

options(stringsAsFactors = F)
test1 <- data.frame(name = c('jimmy','nicker','doodle'), 
                    blood_type = c("A","B","O"))
test1
test2 <- data.frame(name = c('doodle','jimmy','nicker','tony'),
                    group = c("group1","group1","group2","group2"),
                    vision = c(4.2,4.3,4.9,4.5))
test2 
test3 <- data.frame(NAME = c('doodle','jimmy','lucy','nicker'),
                    weight = c(140,145,110,138))
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")

1.內连inner_join,取交集

inner_join(test1, test2, by = "name")
inner_join(test1,test3,by = c("name"="NAME"))

2.左连left_join

left_join(test1, test2, by = 'name')
left_join(test2, test1, by = 'name')

3.全连full_join

full_join(test1, test2, by = 'name')

4.半连接:返回能够与y表匹配的x表所有记录semi_join

semi_join(x = test1, y = test2, by = 'name')

5.反连接:返回无法与y表匹配的x表的所记录anti_join

anti_join(x = test2, y = test1, by = 'name')

6.数据的简单合并

在相当于base包里的cbind()函数和rbind()函数;
注意,bind_rows()函数需要两个表格列数相同,而bind_cols()函数则需要两个数据框有相同的行数。

test1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
test1
test2 <- data.frame(x = c(5,6), y = c(50,60))
test2
test3 <- data.frame(z = c(100,200,300,400))
test3
bind_rows(test1, test2)
bind_cols(test1, test3)

两个实用技能

管道符号(重点)%>%(cmd/ctr + shift + M)

library(dplyr)
x1 = filter(iris,Sepal.Width>3) #一步一停
x2 = select(x1,c("Sepal.Length","Sepal.Width" )) #一步一停
x3 = arrange(x2,Sepal.Length) #一步一停
colnames(iris)
iris %>% 
  filter(Sepal.Width>3) %>% 
  select(c("Sepal.Length","Sepal.Width" ))%>%
  arrange(Sepal.Length)#实现了前一步的输出变成后一步的输入;变成流水线作业

count:主语是数据框,统计数据框某列的重复值

count(test, Species) #其主语是数据框,返回结果是数据框
table(test$Species) # 也可以实现,其主语是向量,返回结果是向量
class(table()) #返回是table,正在淘汰的函数
image.png

stringr(重点)代码在03_stringr_characters.R

rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks."
x

1.检测字符串长度

length(x)
str_length(x)
image.png

2.字符串拆分与组合

单个字符串拆分:

str_split(x," ")# 按照空格拆分
class(str_split(x," ")) #查看数据类型是列表
x2 = str_split(x," ")[[1]] #;列表取子集提取成向量
image.png

多个字符串拆分:

y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ") #得到长度为3的列表,每个元素是一个向量
str_split(y," ",simplify = T) #简化为矩阵
image.png

合并:

str_c(x2,collapse = " ") #把x2的不同元素按照空格连接在一起
str_c(x2,collapse = "::")
str_c(x2,1234,sep = "+") #一个向量和另一个一个元素的向量的连接;循环补齐
image.png

3.提取字符串的一部分

str_sub(x,5,9)
image.png

4.大小写转换

str_to_upper(x2)
str_to_lower(x2)
str_to_title(x2)
image.png

5.字符串定位

str_locate(x2,"th")
str_locate(x2,"h")
image.png

6.字符检测

str_detect(x2,"h") #非常重要的函数;生成一组与x2等长的逻辑支向量;检测是否含有某个值,有是TRUE,可以实现取子集,要学会,否则影响实战
str_starts(x2,"T")
str_ends(x2,"e")
image.png

与sum和mean连用,可以统计匹配的个数和比例

c(TRUE,1)
c(TRUE,F,1)
sum(str_detect(x2,"h")) #TRUE的个数
mean(str_detect(x2,"h"))#TRUE占全部的比例
image.png

7.提取匹配到的字符串

str_extract(x2,"th|Th") #只提取第一次出现的th或者TH
str_extract_all(x2,"o") #提取所有的o
str_extract_all(x2,"o",simplify = T) #简化提取出来的数据位矩阵
image.png

8.字符删除

str_remove(x," ") #移除第一次出现的空格
str_remove_all(x," ") #移除所有空格
str_remove_all(x2,"th") #移除所有出现的th
image.png

9.字符串替换

str_replace(x2,"o","A") #只替换第一次出现的o
str_replace_all(x2,"o","A") #替换所有出现的o 
image.png
# 条件语句和循环语句
## if
if(逻辑值){就
}else{
}
ifelse(str_detect(x,"h"))
## for 循环(初学者最常用)
x通常是向量或者列表
i是指代x里的元素
 
列表简化为矩阵,do.call简化cbind
##while循环
 while(一个变化的逻辑值eg:i<length(x)){
,,,
i = i +1
}
轻易不要用,进入死循环电脑会“自焚”
#apply函数(初学者入门的分水岭)
#lapply函数
列表
#sapply函数
直接返回向量





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

推荐阅读更多精彩内容