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

2023-03-15 17:51:27 浏览数 (3)

一、字符串

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

0 人点赞