一、字符串
代码语言:text复制library(stringr)
x <- "The birch canoe slid on the smooth planks."; x
## [1] "The birch canoe slid on the smooth planks."
1.检测字符串长度:str_length(x)
代码语言:text复制str_length(x)#从左到右,所有字符数,包括空格、符号
## [1] 42
length(x) #向量里的元素数量
## [1] 1
2.字符串拆分:str_split(x," ", simplify = T)
代码语言:text复制str_split(x," ")#以空格分割,结果返回为一个列表
## [[1]]
## [1] "The" "birch" "canoe" "slid" "on"
## [6] "the" "smooth" "planks."
x2 = str_split(x," ")[[1]];x2#不想返回列表就取[[1]]
## [1] "The" "birch" "canoe" "slid" "on"
## [6] "the" "smooth" "planks."
#""引号里什么都不装,则分割为字母(更小单位):
str_split("learn","")[[1]]
## [1] "l" "e" "a" "r" "n"
返回列表的用处:输入为多个元素组成的向量时有用
代码语言:text复制y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")#返回的列表
## [[1]]
## [1] "jimmy" "150"
##
## [[2]]
## [1] "nicker" "140"
##
## [[3]]
## [1] "tony" "152"
不让返回列表,我要矩阵:
代码语言:text复制str_split(y," ",simplify = T)#可直接返回一个矩阵
## [,1] [,2]
## [1,] "jimmy" "150"
## [2,] "nicker" "140"
## [3,] "tony" "152"
class(str_split(y," ",simplify = T))
## [1] "matrix" "array"
3.按位置提取字符串:str_sub(x,n,m)第几到第几
代码语言:text复制str_sub(x,5,9)#x的字符串里的第5至9位
## [1] "birch"
4.字符检测:str_detect(),结果为与字符串长度相等的逻辑值
代码语言:text复制str_detect(x2,"h")#看分割的每个字符里是否含有某个元素,结果为与字符串长度相等的逻辑值
## [1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE
str_starts(x2,"T")#区分大小写的,看分割的每个字符里是否以某一个开始
## [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
str_ends(x2,"e")
## [1] TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
5.字符串替换:str_replace()
代码语言:text复制x2
## [1] "The" "birch" "canoe" "slid" "on"
## [6] "the" "smooth" "planks."
str_replace(x2,"o","A")#一个字符中出现两次只替换第一次出现
## [1] "The" "birch" "canAe" "slid" "An"
## [6] "the" "smAoth" "planks."
str_replace_all(x2,"o","A")#全部替换
## [1] "The" "birch" "canAe" "slid" "An"
## [6] "the" "smAAth" "planks."
6.字符删除:str_remove()
代码语言:text复制x
## [1] "The birch canoe slid on the smooth planks."
str_remove(x," ")#同替换,只删除第一个
## [1] "Thebirch canoe slid on the smooth planks."
str_remove_all(x," ")
## [1] "Thebirchcanoeslidonthesmoothplanks."
二、数据框
*注意改动要赋值
代码语言:text复制test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test
代码语言:txt复制## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 7.0 3.2 4.7 1.4
## 4 6.4 3.2 4.5 1.5
## 5 6.3 3.3 6.0 2.5
## 6 5.8 2.7 5.1 1.9
## Species
## 1 setosa
## 2 setosa
## 3 versicolor
## 4 versicolor
## 5 virginica
## 6 virginica
1.排序:arrange,数据框按照某一列排序
代码语言:text复制library(dplyr)
arrange(test, Sepal.Length) #默认从小到大
arrange(test, desc(Sepal.Length)) #从大到小
2.去重:distinct
将数据框按照某一列去重复,只保留某数据第一次出现的行
代码语言:text复制distinct(test,Species,.keep_all = T)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 7.0 3.2 4.7 1.4
## 3 6.3 3.3 6.0 2.5
## Species
## 1 setosa
## 2 versicolor
## 3 virginica
3.新增:mutate,数据框新增一列
代码语言:text复制mutate(test, new = Sepal.Length * Sepal.Width)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 7.0 3.2 4.7 1.4
## 4 6.4 3.2 4.5 1.5
## 5 6.3 3.3 6.0 2.5
## 6 5.8 2.7 5.1 1.9
## Species new
## 1 setosa 17.85
## 2 setosa 14.70
## 3 versicolor 22.40
## 4 versicolor 20.48
## 5 virginica 20.79
## 6 virginica 15.66
4.管道符号:%>%,过滤与选择:filter、select
ctrl shift m,把上一个运算的结果输入为下一个函数的第一个参数,可以省略很多中间变量
代码语言:text复制x = iris %>%
filter(Sepal.Width>3) %>% #以Sepal.Width>3为条件过滤iris
select(Sepal.Length,Sepal.Width)%>% #选择过滤后iris的某列
arrange(Sepal.Length)
三、条件与循环*难理解
1. 条件
(1)if(){ }
if()里面是一个逻辑值,不能是多个
代码语言:text复制#只有if没有else,那么条件是FALSE时就什么都不做:if (i<0) print('up')
#有else时:
i =1
if (i>0){
print(' ')
} else {
print("-")
}
## [1] " "
(2)ifelse(x,yes,no)
x:逻辑值或逻辑值向量(if不行)
yes:逻辑值为T时的返回值
no:逻辑值为F时的返回值
代码语言:text复制ifelse(i>0," ","-")
## [1] " "
代码语言:text复制#ifelse() str_detect(),王炸,用于分组
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
str_detect(samples,"tumor") %>%
ifelse("tumor", "normal")
## [1] "tumor" "tumor" "tumor" "normal" "normal" "normal"
复习一下管道符
str_detect:看分割的每个字符里是否含有某个元素,结果为与字符串长度相等的逻辑值
(3)多个条件
代码语言:txt复制deg <- mutate(deg,change = ifelse((deg$a < -1)&(deg$b < 0.05),
"down",
ifelse((deg$a > 1)&(deg$b < 0.05),
"up",
"no")))
2. 循环语句
(1)for循环
代码语言:txt复制x = c(1,5,7,3)
y = 1
#将x里的每一个元素print
print(y)
## [1] 1
for (i in x){
print(i)
}
## [1] 1
## [1] 5
## [1] 7
## [1] 3
#将以x里的每一个元素取随机数的结果print
print(rnorm(y))
## [1] -0.5494645
for (i in x){
print(rnorm(i))
}
## [1] 0.5812969
## [1] -1.3142924 0.4223396 -1.0295243 -0.6859025 -0.8505563
## [1] 1.3198144 -0.5561634 2.0427666 2.3206071 -1.6499631
## [6] -1.0953674 1.4839613
## [1] 0.5547274 -0.4918068 2.1382632
理解:有的函数不支持向量化运算,如rnorm,但如果我想生成很多组向量,每一个向量分别是:1个随机数、5个、7个、3个,即把x里的每一个数都带入{}里的函数计算一次
(2)写for循环的两种方法
代码语言:text复制x = c(1,5,7,3)
## 元素循环
s=0
for (i in x){
s=s i
print(c(i,s))
}
## [1] 1 1
## [1] 5 6
## [1] 7 13
## [1] 3 16
#下标循环:其实就是给x按位置取子集
s=0
x[[2]]
## [1] 5
x[2]
## [1] 5
# 下标循环里写x[[i]]和x[i]作用是一样的,都是按位置取子集,只是写这个包的人推荐写x[[i]]
for (i in 1:length(x)){
s=s x[[i]]
print(c(x[[i]],s))
}
## [1] 1 1
## [1] 5 6
## [1] 7 13
## [1] 3 16
(3)补充生成列表的方式、如何保存for循环结果
代码语言:text复制#背景知识补充:生成列表
#法1
a = list(a1 = 1:10,
a2 = 3:8)
#法2
a = list(1:10,
3:8)
names(a) = c("a1", "a2")
#法3
a = list()#生成一个空列表,可以一个个填入元素
a[[1]] = 1:10
a[[2]] = 3:8
names(a) = c("a1","a2")
# 需求:1.生成a里4个list,每个list含1、5、7、3个随机数;2.保存4次rnorm的结果,而不仅仅是输出到控制台
x
## [1] 1 5 7 3
a = list()
a[[1]] = rnorm(1)
a[[2]] = rnorm(5)
a[[3]] = rnorm(7)
a[[4]] = rnorm(3)
# 写循环:
# 目的:1.a里动起来,为1、2、3、4,2.让rnorm里面的数字,第一轮循环等于1,后等于5、7、3
a = list()
for (i in 1:4) {#已经让i动起来了(1、2、3、4)
a[[i]] = rnorm(x[[i]])#在循环里取子集:x[[i]]是推荐的写法
}
#如何将结果存下来?
s = 0
result = list()
for(i in 1:length(x)){
s=s x[[i]]
result[[i]] = c(x[[i]],s)#
}
result#是个列表,但是每个列表都是两个值,因此可以考虑保存为表格
## [[1]]
## [1] 1 1
##
## [[2]]
## [1] 5 6
##
## [[3]]
## [1] 7 13
##
## [[4]]
## [1] 3 16
do.call(cbind,result)#把result里的元素按列拼接
## [,1] [,2] [,3] [,4]
## [1,] 1 5 7 3
## [2,] 1 6 13 16
其他:管理长脚本的方式
- R.data
- if(F){}:被跳过;if(T){}:被执行
引用自生信技能树马拉松课程小洁老师授课内容:R语言基础03