前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言综合应用

R语言综合应用

原创
作者头像
用户10758803
发布2024-03-04 23:46:53
1000
发布2024-03-04 23:46:53

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.玩转字符串
    • str函数(加载stringr函数
    • 2.玩转数据框
      • 1.排序(arrange函数)
        • 2.去重复distinct()
          • 3.数据框新增一列(另一种方法)mutate()
            • 4.管道符号
            • 3.条件语句和循环语句
              • if语句
                • for循环
                  • 取方差最大的1000个基因,(注意apply函数后生成的每一个向量会带有名字)
                  • apply(x,margin,fun,...) #矩阵/数据框的隐式循环
                  • lappy()#列表的隐式循环
              • 4.隐式循环
              • 5.两个数据框的连接
              • 6.split函数
                • split函数
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档