R基础__

本文介绍了R语言中向量的子集提取,排序以及最大值的选择。讨论了if与ifelse的使用差异,并展示了字符串操作,如长度检测、拆分、提取、替换等。此外,还涵盖了数据框的排序、去重和新增列,以及条件语句和循环的应用,包括for循环和apply函数族。最后提到了ggplot2进行数据可视化。
摘要由CSDN通过智能技术生成

赋值快捷键:Alt + -

在循环里面,用两个[[]]取向量的子集

if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量

a = round(rnorm(20),2)
#如何从20个数里挑选最大的5个
#从小到大排序,取最后的5个
sort(a)[16:20]
head(sort(a,decreasing = T),5)  #取前五
tail(sort(a),5)#取后5

load("test2.Rdata")
library(tidyverse)
apply(test,1,var)%>%
   sort() %>%
  tail(1000)%>%
  names()

字符串

rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)

x <- "The birch canoe slid on the smooth planks."
x
### 1.检测字符串长度
str_length(x) #检测向量中的每个元素的字符串
length(x)     #返回的是向量里的1个元素
### 2.字符串拆分
str_split(x," ")#   " "  根据空格拆分后成为一个列表
x2 = str_split(x," ")[[1]];x2

y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ") #将向量中的每一个元素分别拆分成几个列表
str_split(y," ",simplify = T)#simplify = T  成为一个矩阵

### 3.按位置提取字符串
str_sub(x,5,9)
str_sub(y,5,9) #对向量中的每一个元素按照位置提取字符串

### 4.字符检测 返回逻辑值
str_detect(x2,"h") #是否包含
str_starts(x2,"T") #是否以T开头
str_ends(x2,"e")   #是否以e结尾

### 5.字符串替换
x2
str_replace(x2,"o","A")  #替换x2中的o为A,默认只替换其中的第一个o
str_replace_all(x2,"o","A") #替换匹配到的所有结果

### 6.字符删除
x
str_remove(x," ")
str_remove_all(x," ")

###7.转换成小写
str_to_lower()
tolower()

数据框

test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test

# arrange,数据框按照某一列排序

library(dplyr)
arrange(test, Sepal.Length)       #默认从小到大
arrange(test, desc(Sepal.Length)) #从大到小 sort 有decreasing=F函数

# distinct,数据框按照某一列去重复
distinct(test,Species,.keep_all = T)#.keep_all = T 保持所有列
distinct(test,Species)

# mutate,数据框新增一列
mutate(test, new = Sepal.Length * Sepal.Width)
test$new= test$Sepal.Length * test$Sepal.Width
# 连续的步骤

# 1.多次赋值,产生多个变量

x1 = filter(iris,Sepal.Width>3)           #筛选行
x2 = select(x1, Sepal.Length,Sepal.Width) #选择列
x3 = arrange(x2,Sepal.Length)             #按照Sepal.Length排序

# 2.管道符号传递,简洁明了 ctrl+shift+M
x = iris %>%  #把前面一个函数结果传递给后一个函数的第一个参数
  filter(Sepal.Width>3) %>% 
  select(Sepal.Length,Sepal.Width)%>%
  arrange(Sepal.Length)

# 3. 嵌套,代码不易读
arrange(select(filter(iris,Sepal.Width>3),
               Sepal.Length,Sepal.Width),
        Sepal.Length)

条件和循环

rm(list = ls())

## 一.条件语句

###1.if(){ }
#if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量
#### (1)只有if没有else,那么条件是FALSE时就什么都不做

i = -1
if (i<0) print('up')
if (i>0) print('up')

#理解下面代码
if(!require(tidyr)) install.packages('tidyr')

#### (2)有else   
i =1
if (i>0){
  print('+')
} else {
  print("-")
}
i = 1
ifelse(i>0,"+","-")

x = rnorm(3)
x
ifelse(x>0,"+","-")  #输出结果和x长度一致
#if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量

#ifelse()+str_detect(),王炸
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")

k2 = str_detect(samples,"normal");k2   #需要注意要对应关系正确,TURE是代表的什么
ifelse(k2,"normal","tumor")

#### (3)多个条件
i = 0
#嵌套if else  或者函数ifelse,==判断等于
if (i>0){
  print('+')
} else if (i==0) {
  print('0')
} else if (i< 0){
  print('-')
}

ifelse(i>0,"+",ifelse(i<0,"-","0"))

## 二、循环语句

### 1.for循环
x <- c(5,6,0,3)  #元素循环
s=0
for (i in x){
  s=s+i
  print(c(i,s))
}

x <- c(5,6,0,3) #下标循环
s = 0
for (i in 1:length(x)){
  s=s+x[[i]]
  print(c(x[[i]],s))
}

#如何将结果存下来?
s = 0
x <- c(5,6,0,3)
result = list()
for(i in 1:length(x)){
  s=s+x[[i]]
  result[[i]] = c(x[[i]],s)
}
result
do.call(cbind,result)  #把result里的每一个元素按列拼接起来,向量长度需要一样

#在循环里面,用两个[[]]取向量的子集


#列表生成的3种方式
#第一种
a = list(a1=1:10,
         a2=3:8)
#第二种
b=list(1:10,3:8)
names(b)=c("b1","b2")
#第三种 生成空列表,可以一个个填入元素
d = list()
d[[1]] = 1:10
d[[2]] = 3:8
names(d)=c("d1","d2")

构建表达矩阵

# 表达矩阵
set.seed(10086)#随机种子,固定rnorm数
exp = matrix(rnorm(18),ncol = 6)
exp = round(exp,2)#小数点后保留
rownames(exp) = paste0("gene",1:3)#加行名
colnames(exp) = paste0("test",1:6)
exp[,1:3] = exp[,1:3]+1#前三列在原来的数值上加1
exp

library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>% 
  as.data.frame() %>% 
  rownames_to_column() %>% 
  mutate(group = rep(c("control","treat"),each = 3))

pdat = dat%>% #宽变长
  pivot_longer(cols = starts_with("gene"),#想要合并列的列名相同处,可以用名字来选择,也可以按照列数
               names_to = "gene",#新合成列的列名
               values_to = "count") #

library(ggplot2)
p = ggplot(pdat,aes(gene,count))+
  geom_boxplot(aes(fill = group))+
  theme_bw()
p
p + facet_wrap(~gene,scales = "free")

隐式循环

1.apply 处理矩阵或数据框

1.apply 处理矩阵或数据框rm(list = ls())
## apply()族函数

### 1.apply 处理矩阵或数据框----

#apply(X, MARGIN, FUN, …)   ...写函数的参数
#其中X是数据框/矩阵名;
#MARGIN为1表示行,为2表示列,FUN是函数

test<- iris[1:6,1:4]

apply(test, 2, mean)  #函数不要引号

apply(test, 1, sum)

2.lapply(list, FUN, …) 对列表/向量中的每个元素(向量)实施相同的操作

### 2.lapply(list, FUN, …)    ... 是函数的参数 ----
# 对列表/向量中的每个元素(向量)实施相同的操作

test <- list(x = 36:33,y = 32:35,z = 30:27);test

#返回值是列表,对列表中的每个元素(向量)求均值(试试方差var,分位数quantile)

lapply(test,mean)
lapply(test,fivenum)

3.sapply 简化结果,返回矩阵或向量

### 3.sapply 简化结果,返回矩阵或向量

sapply(test,mean)
sapply(test,fivenum)

class(sapply(test,fivenum))

两个数据框的连接

test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
                    blood_type = c("A","B","O","AB"))
test1
test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
                    group = c("group1","group1","group2","group2"),
                    vision = c(4.2,4.3,4.9,4.5))
test2
merge(test1,test2,by="name")
library(dplyr)

inner_join(test1,test2,by="name") #取交集
right_join(test1,test2,by="name") #右连接  完全保留右边的数据框 根据右边保留左边的部分
full_join(test1,test2,by="name")  #全连接
semi_join(test1,test2,by="name")  #半连接 取在test2中的test1的信息
anti_join(test1,test2,by="name")  #反连接 取不存在于test2中的test1的信息

其他

# 1.match-----
load("matchtest.Rdata")
x
y
## 如何把y的列名正确替换为x里面的ID?

## (1)分步解法
a = colnames(y)
b = x$file_name
k = match(a,b);k
#match(a,b)的意思是a里的每个元素在b的第几个位置上。
#是b的下标,可以给b取子集,也可以给与b对应的其他向量取子集。
colnames(y) = x$ID[k]

## (2)一步解法
load("matchtest.Rdata")
colnames(y) = x$ID[match(colnames(y),x$file_name)]

## (3)放弃match的解法
load("matchtest.Rdata")
rownames(x) = x$file_name
x = x[colnames(y),]
colnames(y) = x$ID

# 2.一些搞文件的函数----
dir() # 列出工作目录下的文件
dir(pattern = ".R$") #列出工作目录下以.R结尾的文件

file.create("douhua.txt") #用代码创建文件
file.exists("douhua.txt") #某文件在工作目录下是否存在
file.remove("douhua.txt") #用代码删除文件
file.exists("douhua.txt") #删掉了就不存在啦

## 可以批量的新建和删除
f = paste0("douhua",1:100,".txt")
file.create(f)
file.remove(f)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxiang学生信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值