目录
library(tidyverse)
library(data.table)
library(stringr)
data=fread("",header = T, sep = '\t',data.table = F)
data=read.table("data.csv",header=TRUE,sep=",")
1. 行、列名称,转换
1.1 预览data
head(data)
1.2 得到行名/列名
rowname=row.names(data)
colname=colnames(data)
1.3 重命名行、列
rownames(data)=c("a","b","c") rownames(data)=data$name rownames(data)=data[,1]
colnames(data)=c(rep("a", 3)) colnames(data)=data[1,]
colnames(data)[3]=c("Gene_name")
rownames_to_column(data,"type") #行名转为列
1.4 计算行数/列数
ncol()
nrow()
1.5 制作数据
group_list <- c(rep('tumor',ncol(data)),rep('normal',ncol(data)))
[1] "tumor" "tumor" "tumor" "tumor" "tumor" "tumor" "tumor" "tumor" "tumor" "tumor" "tumor"
[166] "normal" "normal" "normal" "normal" "normal" "normal" "normal" "normal" "normal"
1.5 修改列名
rename(data,c("newname"=col)) ##左侧为newname,右侧为oldname
2. 按值筛选观测:行的筛选
比较运算符:>、>=、<、<=、!=(不等于)和==(等于)。
& 表示“与”、| 表示“或”、! 表示“非”。
%/%(整数除法)和%%(求余)
对数函数:log()、log2() 和log10()
lead() 和lag() 函数可以返回一个序列的领先值和滞后值。
2.1 筛选第n行
data[n,]
data[c(n1,n2,n3),]
2.2 筛选符合特定条件的行
2.2. 根据变量variable的观测值筛选 (数值变量)
filter(data, bmi >=27, age ==30)# ,表示且
filter(data, age>=40 & age<=30) # &表示且
filter(data, age>=40| age<=30)# |表示或
filter(condition1, condition2) 两个条件都符合;
filter(condition1, !condition2) 条件1是TRUE,条件2是FALSE;
filter(condition1 | condition2) 两个条件符合其中一个即可;
filter(xor(condition1, condition2) 只有一个条件符合!两个都符合不可以。
between函数选择某区间
msleep %>% select(name, sleep_total) %>%
filter(between(sleep_total, 16, 18)) %>% head(2)
2.2 根据变量variable的字符筛选 (字符变量)
filter(data,MHO %in% c("YES","NO"))
filter(data,!MHO %in% c("YES","NO"))
2.3 根据行名筛选
data[c("names",)
2.4 filter不包含NA的
filter(!is.na(),)
2.4 正则表达式
msleep %>% select(name, sleep_total) %>%
filter(str_detect(tolower(name), pattern = "mouse"))
dplyr::filter(mtcars, grepl('Ferrari', type)) 筛选某一列中变量包含某字符的行
2.5 跨多列筛选
主要筛选函数:
filter_all() 所有列参与筛选,根据筛选条件筛选
filter_if() 逻辑判断确定哪些列参与筛选,根据筛选条件筛选
filter_at() vars()函数定义哪些列参与筛选,根据筛选条件筛选
filter_all(any_vars(str_detect(., pattern = "Ca")))
any_vars() 类似OR,all_vars()则类似AND
filter_if(is.character, any_vars(is.na(.)))
#筛选sleep_total, sleep_rem两个变量,所有值均大于5的行
msleep %>%
select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
filter_at(vars(sleep_total, sleep_rem), all_vars(.>5))
msleep %>%
select(name, sleep_total:sleep_rem, brainwt:bodywt) %>%
filter_at(vars(contains("sleep")), all_vars(.>5))
善用属于符号:%in% (ctrl+shift+M),以及不要忘记XX$V1。
我想要提取数据框cpm2中行名在vector interest中的行,使用如下指令解决。
interest<-read.table("result_coding_gene_id_2.txt")
data<-cpm2[which(rownames(cpm2)%in%interest$V1),]
filter() 只能筛选出条件为TRUE 的行;它会排除那些条件为FALSE 和NA 的行。如果想保
留缺失值,可以明确指出:is.na(x) | 其余条件
可以和between联用
between(x, left, right)
This is a shortcut for x >= left & x <= right,
3. 数据(列)选择 variable
3.1 排除或选择特定的 某几列,对应名称
select(data, sex, age, bmi) #选取sex age bmi 三列
select(data, -sex, -age, -bmi) #选取sex age bmi 三列以外的列
select(data, c(1,2,5)) ####选取第1、2、5 列
select(data, -c(1,2,5)) ####选取第1、2、5以外的列
select(data, sex:bmi) #选取sex至bmi 的所有列
msleep %>%
select(-(name:genus), -conservation,-(ends_with("e"))) %>% head(2)
3.2 选择若干列
start_col:end_col
msleep %>%
select(name:vore, sleep_total:awake) %>% head(2)
###R自带的Rcode:
data[,c(1,2)] ###选取第1、2列
data[,2:ncol(data)] ###选取第1列以外的列数
3.3 提取/去除列名中为特定字符的列
select(data, matches("TARGET")) #表达式匹配,返回变量名中包含TARGET的列
select(data, -matches("TARGET")) #表达式匹配,返回变量名中包含TARGET的列
#选择任何包含“a”,后跟一个或多个其他字母和“e”的列
msleep %>%
select(matches("a.+e")) %>% head(2)
###R自带的Rcode:
test1=data[c(grep("列名",colnames(data)))]
other=data[-c(grep("BC|FT",colnames(data)))]
还可以用starts_with,ends_with,contains,matches,one_of,num_range和everything 含有特定字符的
select(data, starts_with("TARGET"),starts_with("TCGA")) #选取TARGET TCGA开头 做列名的
select(data, -starts_with("TCGA")) #选取TCGA开头 以外 做列名的
select(data, ends_with("01A")) #选取变量名后缀包含01A的列
select(data, -ends_with("01A")) #选取变量名后缀不包含01A的列
select(data, contains("TARGET")) #选取变量名中包含TARGET的列
elect(data, -contains("TARGET")) #选取变量名中不包含TARGET的列
vars <- c("sex", "year")
select(data, one_of(vars)) #等价于select(data, one_of(vars))
select(data, -one_of(vars)) #除age sex之外的列
select(data, everything()) #所有列
select(data, age, everything()) #调整顺序,age位于所有列前面
3.4 根据逻辑选择 #is.numeric is.integer,is.double,is.logical,is.factor。
data%>%select_if(is.numeric)
msleep %>%
select_if(is.numeric) %>%
select_if(~mean(., na.rm=TRUE) > 10) %>% head(2)
注:select_all / if 函数要求将函数作为参数传递。因为mean > 10 本身不是函数,所以需要前面添加“~”表示匿名函数;或者使用funs()先将函数包装。
more_than_10 <- function(x) {
mean(x,na.rm=TRUE) > 10
}
msleep %>% select_if(is.numeric) %>% select_if(more_than_10) %>% head(2)
结合 n_distinct()选择具有不少于20个不同答案的列。
msleep %>%
select_if(~n_distinct(.) >= 20) %>% head(2)
3.5 select() 函数和everything() 辅助函数结合起来使用。当想要将几个变量移到数据框开头时
select(flights, time_hour, air_time, everything())
3.6 one_of;此外还有any_of all_of
vars <-
select(,one_of(vars))
3.7 更改列名
msleep %>%
select(animal = name, sleep_total) %>% head(2)
select_all()函数允许更改所有列,并以一个函数作为参数
msleep %>%
select_all(toupper) %>% head(2)
3.8 rownames_to_column()
此外也可以利用distinct()函数根据某列的数值对重复行进行筛选:
distinct(select(data, sex, age, bmi))
一列变多列
按照特定字符拆
separate(ID2, into = c("Gene2", "IDnum2"),sep = "/",remove = FALSE)
按照第几个字符拆
separate(Sample, into = c("Sample", "bar"),sep = 16)
合
unite(ID_new, ID:ID2, sep = "_")
4. 数据排序
arrange()函数可以帮助用户对于数据各行进行重新排序:缺失值总是排在最后
arrange(data, age, bmi)
上面的代码就将所有数据按age bmi的优先度进行row的重新排序。我们也可以用desc关键字将glu0做降序:缺失值总是排在最后
arrange(data, desc(glu0))
5. 数据变形
5.1 生成新变量mutate
mutate(data,whr2 = waist/hip*2, bmi2= weight/height*2)
data%>%mutate(data,whr2 = waist/hip*2, bmi2= weight/height*2) #也可以这样
5.2 修改原变量
transform(data, bmi = bmi/2, waistohip = waistohip / 0.8)
5.3 只保留新变量
transmute(data,whr = waist/hip, bmi= weight/height)
5.4 删除某列
删除列
data %>% mutate(age= NULL)
6.数据汇总
在dplyr包里我们使用summerise()函数进行数据汇总。其中na.rm则表示去除所有含有缺失数据的行。group_by() 可以将分析单位从整个数据集更改为单个分组。接下来,在分组后的数据框上使用dplyr 函数时,它们会自动地应用到每个分组。group_by() 和summarize() 的组合构成了使用dplyr 包时最常用的操作之一:分组摘要。
summarise(data, bmi = mean(bmi, na.rm = TRUE)) #可以新建某variable
除此之外,我们还可以用sample_n() and sample_frac()函数随机选择计算汇总数据。
library(nycflights13)
by_dest <- group_by(flights, dest)
delay <- summarize(by_dest,
count = n(), ##计数
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
)
not_cancelled %>%
count(tailnum, wt = distance)
wt If NULL (the default), counts the number of rows in each group.
If a variable, computes sum(wt) for each group.
summarise_if完成一类变量的汇总
iris %>%
summarise_if(is.numeric, ~ mean(., na.rm = TRUE))
summarise_at完成指定变量的汇总
summarise_at配合vars,可以更灵活的筛选符合条件的列,然后进行汇总
iris %>%
summarise_at(vars(ends_with("Length"),Petal.Width),
list(~mean(.), ~median(.)))
7.数据分组
group_by() 和 summarise() 的组合构成了使用 dplyr 包时最常用的操作之一:分组摘要
data %>%group_by(sex) %>%
summarise(mean = mean(age), n = n()) #按性别分组,求age平均数
sex mean n
<chr> <dbl> <int>
1 FM 35.1 432
2 M 35.0 263
按照MHO,sex分组求bmi平均数和标准差
data %>%
group_by(MHO, sex) %>%
summarise(meanbmi = mean(bmi,na.rm=TRUE), sdbmi = sd(bmi,na.rm=TRUE), na.rm=TRUE,n = n())
-
n() :无需参数返回当前分组的大小;
-
sum(!is.na(x)) :返回非缺失值的梳理;
-
n_distinct(x):返回 唯一值的数量。
-
count
函数进行计数
data %>%
group_by(MHO, sex) %>%
summarise(n = n()) %>%
group_vars()
分组新变量(和筛选器)
分组筛选器的作用相当于分组新变量加上未分组筛选器。一般不使用分组筛选器,除非
是为了完成快速、粗略的数据处理,否则很难检查数据处理的结果是否正确。
##找出每个分组中最差的成员:
flights_sml %>%
group_by(year, month, day) %>%
filter(rank(desc(arr_delay)) < 10)
##找出大于某个阈值的所有分组:
popular_dests <- flights %>%
group_by(dest) %>%
filter(n() > 365)
##对数据进行标准化以计算分组指标:
popular_dests %>%
filter(arr_delay > 0) %>%
mutate(prop_delay = arr_delay / sum(arr_delay)) %>%
select(year:day, dest, arr_delay, prop_delay)
如果想要取消分组,并回到未分组的数据继续操作,那么可以使用ungroup() 函数
7.6 逻辑值的计数和比例
当与数值型函数一同使用时, TRUE 会转换为 1, FALSE 会转换为 0。
这使得 sum() 和 mean() 非常适用于逻辑值:sum(x) 可以找出 x 中 TRUE 的数量, mean(x) 则可以找出比例
iris %>%
group_by(Species) %>%
summarise( n_pet_len = n(),
noNA_n_pet_len = sum(!is.na(Petal.Length)),
Petal.Length_uniq_n = n_distinct(Petal.Length),
Petal.Length_uniq_n2 = sum(n_distinct(Petal.Length) >= 20)
)
8. 数据链接
数据框中经常需要将多个表进行连接操作, 如左连接、右连接、内连接等,dplyr包也提供了数据集的连接操作
read.table("d:\\x.csv",header=TRUE,sep=",")->x
read.table("d:\\y.csv",header=TRUE,sep=",")->y
library(dplyr)
inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) #内连接
left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) #左连接
right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) #右连接
full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) #全合并
semi_join(x,y, by = NULL, copy = FALSE, ...) #返回能够与y表匹配的x表所有记录
anti_join(x, y, by = NULL, copy = FALSE, ...) #返回无法与y表匹配的x表的所有记录
x <- tribble(
~sample, ~ensemble,
1, "x1",
2, "x2",
3, "x3",
4, "x3",
5, "x5"
)
y <- tribble(
~ensemble, ~name,
"x1", "y1",
"x2", "y2",
"x3", "y3",
"x4", "y4")
x %>%
inner_join(y, by = "ensemble")
sample ensemble name
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 y3
4 4 x3 y3
x %>%
full_join(y, by = "ensemble")
其结果是
sample ensemble name
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 y3
4 4 x3 y3
5 5 x5 NA
6 NA x4 y4
x %>%
left_join(y, by = "ensemble")
此时的结果为
sample ensemble name
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 y3
4 4 x3 y3
5 5 x5 NA 当y表关键字不唯⼀时,x表的会增加记录条数
x %>%
right_join(y, by = "ensemble")
sample ensemble name
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 y3
4 4 x3 y3
5 NA x4 y4
x %>%
merge(y, by = "ensemble")
ensemble sample name
1 x1 1 y1
2 x2 2 y2
3 x3 3 y3
4 x3 4 y3
cbind,数据 m列,数据 n列,合并为m+n列;
rbind,数据 m行,数据 n行,合并为m+n行;
9. 集合、矩阵操作函数: set和merge
- 矩阵的合并
merge()####合并
data=merge(data1,data,by.x = 0,by.y = 0) ###直接合并
TEXFPKMgene=merge(geneid23,GTEXFPKMneed,by.y ="id",by.x = "id") ###通过列名id和行名id合并
intersect(x,y, ...) #取两个集合的交集
sameGene=intersect( row.names(data1),col.names(data2) )##提取data1、data2相同的基因
取data1中的sameGene行,data1 <- data1[sameGene,,drop=F]
取data2中的sameGene行,data2 <- data2[,sameGene]
cbind(data1,data2,data3) ##合并3个数据集
data=cbind(data1[sameGene,],data2[sameGene,]) ##合并两个数据集共有的基因de数据
union(x,y, ...) #取两个集合的并集,并进行去重
union_all(x,y, ...) #取两个集合的并集,不去重
setdiff(x,y, ...) #取两个集合的差集
setequal(x, y, ...) #判断两个集合是否相等
identical(colnames(x), rownames(y))#判断两个集合行名列名是否相等是否相等
10. 汇总函数:tally系列
tally是一个很方便的计数函数,其根据最初的调用而决定下一次调用n或者sum(n)。它还有其他的小伙伴比如count和n,都是计数家族的。
data%>%group_by(sex)%>%tally
11. 抽样函数:sample系列
此sample系列是对数据框进行随机抽样,只作用于数据框和dplyr自带的tbl等格式的数据。sample_n为按行数随机抽样,而sample_frac为按比例抽样;其weight参数可以设置抽样的权重而replace参数为有放回抽样。
sample_n(mtcars,2,replace=TRUE)
sample_n(mtcars,2,weight=mpg/mean(mpg))
sample_frac(mtcars,0.1)
sample_frac(mtcars,0.1,weight=1/mpg)
12. 数据转换
用pivot_longer和pivot_wider进行长宽数据转换
pivot_longer(data,
cols=c("variable",variable2"),
names_to="variable",
values_to ="value")
pivot_wider(data,
names_from=variable,
values_from =value)
13. across
across
c_across
14. colwise和rowwise
colwise这个概念来自dplyr
工具包,其本身并不是一个函数,具体操作函数包括across
、if_any
和if_all
。
across(.cols = everything(), .fns = NULL, ...,
.names = NULL)
.cols:数据框中的变量名,默认为所有变量;
.fns:处理函数;
.names:处理后输出的变量名称。
across(everything(), mean,
.names = "mean_col")
data %>%
group_by(cyl) %>%
summarise(across(everything(), mean,
.names = "mean_{.col}"))
## cyl mean_mpg mean_disp mean_hp mean_drat mean_wt mean_qsec mean_vs mean_am
## * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 26.7 105. 82.6 4.07 2.29 19.1 0.909 0.727
## 2 6 19.7 183. 122. 3.59 3.12 18.0 0.571 0.429
## 3 8 15.1 353. 209. 3.23 4.00 16.8 0 0.143
15. rename
rename(flights, tail_num = tailnum)
16. count
count(tailnum, wt = distance)
wt If NULL (the default), counts the number of rows in each group.
If a variable, computes sum(wt) for each group.