前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言基础笔记-04(字符串、数据框、条件与循环)

R语言基础笔记-04(字符串、数据框、条件与循环)

原创
作者头像
我不知道
修改2023-03-15 17:51:27
8060
修改2023-03-15 17:51:27
举报
文章被收录于专栏:生信学习笔记01生信学习笔记01

一、字符串

代码语言: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

其他:管理长脚本的方式

  1. R.data
  2. if(F){}:被跳过;if(T){}:被执行

引用自生信技能树马拉松课程小洁老师授课内容:R语言基础03

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、字符串
    • 1.检测字符串长度:str_length(x)
      • 2.字符串拆分:str_split(x," ", simplify = T)
        • 3.按位置提取字符串:str_sub(x,n,m)第几到第几
          • 4.字符检测:str_detect(),结果为与字符串长度相等的逻辑值
            • 5.字符串替换:str_replace()
              • 6.字符删除:str_remove()
              • 二、数据框
                • 1.排序:arrange,数据框按照某一列排序
                  • 2.去重:distinct
                    • 3.新增:mutate,数据框新增一列
                      • 4.管道符号:%>%,过滤与选择:filter、select
                      • 三、条件与循环*难理解
                        • 1. 条件
                          • (1)if(){ }
                          • (2)ifelse(x,yes,no)
                          • (3)多个条件
                        • 2. 循环语句
                          • (1)for循环
                          • (2)写for循环的两种方法
                          • (3)补充生成列表的方式、如何保存for循环结果
                      • 其他:管理长脚本的方式
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档