R语言数据处理 Tidyverse

本文介绍了R语言Tidyverse包在数据处理中的应用,涵盖了行、列操作,数据筛选,列选择,排序,变形,汇总,分组,数据链接,集合操作,汇总函数,抽样函数等多个方面,提供了实用的函数和示例。
摘要由CSDN通过智能技术生成

目录

1. 行、列名称,转换

2. 按值筛选观测:行的筛选

3. 数据(列)选择 variable

4. 数据排序

5. 数据变形

6.数据汇总

7.数据分组

8. 数据链接

9. 集合、矩阵操作函数: set和merge

10. 汇总函数:tally系列

11. 抽样函数:sample系列

12. 数据转换

13. across

14. colwise和rowwise

rename


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工具包,其本身并不是一个函数,具体操作函数包括acrossif_anyif_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.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值