当前位置:网站首页>R语言中给数据框增加分组/根据样本名称添加分组的代码
R语言中给数据框增加分组/根据样本名称添加分组的代码
2022-07-29 15:28:00 【18kkk】
因为在工作中常常会遇到,需要根据样本名称,新建分组情况划分treat或者control组,有多种代码方式,在这里总结记录一下,以备不时之需求。
目的:根据样本名划分分组
比如这样的数据,必然要根据title划分control或者treat组
期待效果应该是这样的
先建立数据框,方便练习,给出代码
group <- data.frame(
ID=c("GSM1052615",
"GSM1052616",
"GSM1052617",
"GSM1052618",
"GSM1052619",
"GSM1052620"),
title=c("A375 cells 24h Control rep1",
"A375 cells 24h Control rep2",
"A375 cells 24h Control rep3",
"A375 cells 24h Vemurafenib rep1",
"A375 cells 24h Vemurafenib rep2",
"A375 cells 24h Vemurafenib rep3"))
方法1
x <- ifelse(str_detect(group$title,"Control"),"control","treat")
group$group <- x
法1利用的是基础包的ifelse函数,和stringr包的str_detect函数。两根函数的格式也很清晰如下图:
ifelse第一个参数返回逻辑值,T or F,如果返回的是TRUE就执行第二项参数,如果返回的是FALSE就执行第三项参数.那么很自然而然就想要找能返回逻辑值的东西填在第一个参数那里。关于逻辑值的问题,像%in%,str_detect都是返回逻辑值的,而像which和match函数是返回下标位置的,虽然二者在配合[ ]符号进行取值时可以达到相同的效果,但在ifelse时我们显然需要选择返回逻辑值的函数。这里用str_detect,他的作用是对字符串进行操作,查找有无特定的字符,第一个参数输入被查找的字符串向量,第二个参数标注要求查找字符串,有的就会返回T,没有的返回F。这样搭配ifelese,就会得到下图的结果 。
把结果储存给x,再新建一列赋值就好啦。
方法2
a <- mutate(group[str_detect(group$title,"Control"),],group=rep("control",3))
b <- mutate(group[!str_detect(group$title,"Control"),],group=rep("treat",3))
x <- rbind(a,b)
稍微绕了一点,核心依然是str_detect函数。前文讲到,返回的逻辑值可以和[ ]搭配取值,这里的核心思想时将group数据框中有control和没有control(用!来取相反逻辑值)的数据分别取出来,再利用tidyverse包的mutate函数快捷给数据添加分组信息。mutate函数给数据框添加新列很好用,第一个参数指定数据,第二个参数 新列名=数据就可以了。效果如图,最后把两个数据一合并就行。合并的时候注意a b的列名是一致的,所以按照“按行合并(rbind)(row),列名一致”的原则,用rbind函数。
方法3
group[str_detect(group$title,"Control"),'group'] <- "control"
group[!str_detect(group$title,"Control"),'group'] <- "treat"
代码用的函数最少,但是逻辑有点难记,需要多加练习。
str_detect用来取出逻辑值。[ ]中,逗号前面的部分用来取出相关的行,即前三行/后三行,逗号后面的"group"是需要新建列的名称,<- 后面的则是给新列赋值
灵感来源于常见的一段代码:
data[which(data$age < 18),'age_group'] <- "young"
data是一个有age变量的数据,希望把年龄小于18的定义为"young"
只不过这里用来取数据的不是逻辑值,而是which和他定义的下标
方法4
这个其实不是个方法 只是纪念一下自己刚刚开始学R写出来的代码,大抵就是从这会儿开始觉得要掌握R基础
一顿操作猛如虎
myseries$Condition <- c(rep(NA,length(myseries$Series)))
for (i in(1:length(myseries$Series))) {
myseries$Condition[i] <- unlist(strsplit(myseries$Sample[i], "_"))[length(unlist(strsplit(myseries$Sample[i], "_")))-1]
}
草草看了一下,大概是用strsplit来把sample打散(甚至用的不是str_split),然后用unlist取消list格式(甚至不会simplify=T),然后for循环赋值进去,也没想到可以直接写赋值,还提取了原文的赋值
目的:根据表达量高低来分组(UP & DOWN)
数据如图所示:
要求:
# a< -1 且b<0.05,则x对应的值为down;
# a>1 且b<0.05,则x对应的值为up;
# 其他情况,x对应的值为no
结果:
方法1:
传统的取下标难以应对“其他情况,x对应的值为no”,这里做了一个函数来填补NA值
deg[which(deg$a<(-1) & deg$b<0.05),"x"] <- "down"
deg[which(deg$a>1 & deg$b<0.05),"x"] <- "up"
FillNA <- function(x){#填充NA
x[is.na(x )]<- "no";
x
}
deg$x <- FillNA(deg$x)
table(deg$x)
# down no up
# 1059 28863 853
方法2:
利用ifelse进行嵌套
# 定义两个变量
k1 <- deg$a<(-1) & deg$b<0.05
k2 <- deg$a>1 & deg$b<0.05
deg$x <- ifelse(k1,"down",ifelse(k2,"up","no"))
table(deg$x)
# down no up
# 1059 28863 853
总结:
ifelse的嵌套是非常好的分类工具,单独使用或者配合str_detect返回的逻辑值都很好用
边栏推荐
- 数据库管控平台-awr报告采集(mysql/oracle)
- 线程中的常见方法
- 最新!多交的税可以退,同学,你今天退税了吗?
- 文件管理:文件的物理结构
- [MySQL] 排序与分页
- See you in shenzhen!Cloud native to accelerate the application building special: see cloud native FinOps, SRE, high-performance computing scenario best practices
- Shell脚本编程-运算
- 详解微处理器CPU的系统结构
- bit field in c language
- 蚂蚁三面滑铁卢!遭分布式截胡,靠这些笔记潜修 30 天,挺进京东
猜你喜欢
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
Detailed evaluation of Renesas RZ/G2L processor
Property (Property Animation Animation), the basic use of Butterknife butter knife
ES6 from entry to master # 10: Set the Set data type
ES6 从入门到精通 # 11:Map 数据类型
Qt笔记-利用QAxObject将文件夹内的所有docx转pdf
Floating point memory storage problem
网络知识大集合(最详细)与网络通信过程
文件管理:文件的物理结构
腾讯云数据库负责人林晓斌借1亿炒股:已爆仓破产
随机推荐
【小程序项目开发-- 京东商城】uni-app之商品列表页面 (上)
国内EDA领导者芯和半导体完成最新一轮超亿元融资
教程篇(7.0) 07. 诊断和故障排除 * FortiClient EMS * Fortinet 网络安全专家 NSE 5
如何检测出你们安装的依赖是否安全
手摸手实现Canal如何接入MySQL实现数据写操作监听
Mobileye展示与Intel合作开发的硅光子激光雷达芯片
MySQL数据库————数据库语言(DDL与DML)
一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?
Shell脚本编程-运算
电子元器件行业B2B交易系统:规范企业交易流程,提升销售管理效率
线程中的常见方法
DevOps的未来趋势
zabbix邮件发送告警信息
文件管理:文件的逻辑结构
浮点数内存存储问题
Comparator和Comparable
Do you really understand the persistence mechanism of Redis?
PHP 读取/导出 CSV文件
详解微处理器CPU的系统结构
展讯模块读写IMEI