1.玩转字符串
str函数(加载stringr函数
1.拆分字符串str_split
代码语言:js复制library(stringr)
y = c("jimmy 150","nicker 140","tony 152")
> str_split(y," ")#生成的数据为列表
[[1]]
[1] "jimmy" "150"
[[2]]
[1] "nicker" "140"
> str_split(y," ",simplify = T)#将生成的数据转变为矩阵
[,1] [,2]
[1,] "jimmy" "150"
[2,] "nicker" "140"
[3,] "tony" "152"
2.按位置提取字符(str_sub)
代码语言:js复制> x = c("jimmy 150","nicker 140")
> str_sub(x,1,4)#1到4代表每个字符串的前1位到第4位
[1] "jimm" "nick"
3.字符检测(str_detect)
代码语言:js复制> str_detect(x2,"h") #x2里是否有h
[1] TRUE TRUE FALSE FALSE FALSE TRUE
[7] TRUE FALSE
> str_starts(x2,"T") #x2里是否以x2开头
> str_ends(x2,"e")
4.字符替换(str_replace)
代码语言:js复制str_replace(x2,"o","A")#只替换每个字符串出现的第一个o
str_replace_all(x2,"o","A")#替换每个字符串出现的所有o
2.玩转数据框
1.排序(arrange函数)
代码语言:js复制arrange(test, Sepal.Length)#按照Sepal.Length的数据大小从小到大排序
arrange(test, desc(Sepal.Length)) #从大到小排序
2.去重复distinct()
代码语言:js复制distinct(test,Species,.keep_all = T)# distinct,数据框按照某一列去重复
3.数据框新增一列(另一种方法)mutate()
代码语言:js复制mutate(test#数据名,新的列名= Sepal.Length * Sepal.Width)
deg <-mutate(deg,probe_id=rownames(deg))#举例
4.管道符号
代码语言:js复制# 1.管道符号传递,简洁明了
x = iris %>%
filter(Sepal.Width>3) %>%
select(Sepal.Length,Sepal.Width)%>%
arrange(Sepal.Length)
#管道符号传递给下一个函数,作为下一个函数的第一个参数,逗号前的数据
分别与下列的iris、x1、x2、x3对应
# 2.多次赋值,产生多个变量
x1 = filter(iris,Sepal.Width>3)
x2 = select(x1, Sepal.Length,Sepal.Width)
x3 = arrange(x2,Sepal.Length)
3.条件语句和循环语句
if语句
- if(){code1} eles{code2}##括号里是一个逻辑值,T时,code1被执行,F则跳过code1,什么都不执行/执行code2(在有eles的情况下,eles相当于否则的意思)
> x = rnorm(3)
ifelse(x>0," ","-")
[1] "-" " " " "
#ifelse() str_detect(),王炸
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
> k1 = str_detect(samples,"tumor");k1 #查找哪些样本里有tumor这个字符
[1] TRUE TRUE TRUE FALSE FALSE FALSE
> ifelse(k1,"tumor","normal")
[1] "tumor" "tumor" "tumor" "normal"
- ifeles(x,yes,no) #x:指变量名称,逻辑值或者逻辑值向量。不支持逻辑值组成的向量 yes:逻辑值位TRUE的返回值 , no:逻辑值为FALSE的返回值
for循环
for(i in x){code}
x:指变量名称,只要是一个向量即可
i :代称,比如第一次循环则代表in后面向量的第一个元素;第二次则为第二个元素,直到完成in后面向量里所有元素的循环为止。如in后面的向量有8个元素,则8次循环。
代码语言:js复制x <- c(5,6,0,3)#这里展示下标循环
s = 0
for (i in 1:length(x)){
s=s x[[i]]
print(c(x[[i]],s))
}
代码语言:js复制为什么要下标循环?更好储存结果?
#x <- c(5,6,0,3)
s = 0
result = list()
for(i in 1:length(x)){
s=s x[[i]]
result[[i]] = c(x[[i]],s)
}
result
[[1]]
[1] 5 5
[[2]]
[1] 6 11
函数 do.call(cbind,result) ,do.call批量运算,cbind按列拼接。将result变为一个矩阵
取方差最大的1000个基因,(注意apply函数后生成的每一个向量会带有名字)
代码语言:js复制load("test2.Rdata")
v = apply(test, 1, var)
v =sort(v)
n = tail(v,1000)
names(n)
names(tail(sort(apply(test, 1, var)),1000))
4.隐式循环
apply(x,margin,fun,...) #矩阵/数据框的隐式循环
x:数据框/矩阵名
margin:1表示行,2表示列
fun:代表函数。对x的每一行/列进行fun这个函数
代码语言:js复制test<- iris[1:6,1:4]
apply(test, 2, mean) #对test的每一列求平均值
lappy()#列表的隐式循环
代码语言:js复制test <- list(x = 36:33,y = 32:35,z = 30:27);test
lapply(test,mean)
$x
[1] 34.5
$y
[1] 33.5
$z
[1] 28.5
sapply()简化结果,返回矩阵或向量
代码语言:js复制sapply(test,fivenum) #矩阵
> sapply(test,fivenum)
x y z
[1,] 33.0 32.0 27.0
[2,] 33.5 32.5 27.5
[3,] 34.5 33.5 28.5
[4,] 35.5 34.5 29.5
[5,] 36.0 35.0 30.0
5.两个数据框的连接
6.split函数
split函数
将数据x按照f分组,等于将x里的数据附上因子水平?
代码语言:js复制#R
split(x, f, drop = FALSE, ...)
## Default S3 method:
split(x, f, drop = FALSE, sep = ".", lex.order = FALSE, ...)
split(x, f, drop = FALSE, ...) <- value
x: 一个待分组的向量或者data frame
f: 函数,一个factor或者list(如果list中元素交互作用于分组中),以此为规则将x分组
drop: 逻辑值,如果f中的某一个level没有用上则被弃用
value: 一个储存向量的list,其形式类似于分组完成之后返回的那个list
自己将数字赋予因子水平
代码语言:js复制> x <- c(rnorm(10), runif(10),rnorm(10,1))
> f<- gl(3,10)#因子数为3个,每个数据重复10次,即输出结果为1(10次)2(10次)3(10次),共输出30个,将x里的数与f生成的数据的顺序对应,再分别将顺序为1的数据分为一组,2的数据分为1组,3的数据分一组
> split(x,f)
$`1`
[1] 0.5370274 -0.8772336 -0.1203692 -1.6985533 -0.6796235
[6] -1.0284270 1.9282473 0.5562795 0.2560315 0.1244326
$`2`
[1] 0.88297485 0.56093613 0.98450850 0.05455810 0.43596680
[6] 0.01397831 0.41145110 0.43259515 0.85048958 0.10283914
$`3`
[1] 3.0159349 0.3021140 0.7565265 1.4841716 1.2435489
[6] 1.6161955 1.3092779 1.2535495 1.1271382 1.0764003
给数据框分类,可以再用sappy函数给分好的小组取平均数
代码语言:js复制> d <- data.frame(gender=c("M","M","F","M","F","F"),age=c(47,59,21,32,33,24),income=c(55000,88000,32450,76500,123000,45650), over25=rep(c(1,1,0), times=2))
> d
gender age income over25
1 M 47 55000 1
2 M 59 88000 1
3 F 21 32450 0
4 M 32 76500 1
5 F 33 123000 1
6 F 24 45650 0
> split(d$income, list(d$gender,d$over25)) #将income按照gender、over25分组
$`F.0`
[1] 32450 45650
$M.0
numeric(0)
$F.1
[1] 123000
$M.1
[1] 55000 88000 76500