R语言综合应用

2024-03-04 23:46:53 浏览数 (2)

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语句

  1. if(){code1} eles{code2}##括号里是一个逻辑值,T时,code1被执行,F则跳过code1,什么都不执行/执行code2(在有eles的情况下,eles相当于否则的意思)
代码语言:js复制
> 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"
  1. 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

0 人点赞