自己写函数,套进apply,飞起~
今天是生信星球陪你的第432天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
问题
午后,小郭同学(我们公司最小的同事)拿着电脑,睡眼惺忪走过来问我,怎么根据前三列的内容分情况生成第四列?
这孩子为了完成曾老板发的任务,中午没有睡觉,可怜巴巴的卡在了这个问题上。
看到数据框,我就很放心了,放着我来!
他的要求是:
如果前三列内容都是“+”,第四列就是“B”;
如果前三列内容都是“-”,第四列就是“TNBC”;
如果前两列有一个“+”,第三列是“-”,第四列就是“A”
其他情况都写“H”
思路
1.如果。。。就。。。,这是if语句,多个条件,可以写ifelse,也可以写成if…elseif…。
2.因为是根据已有内容生成一新列,可以用apply套用自己写的函数,将一行的前三列作为函数的输入数据,第四列作为函数的输出数据。
代码实现
1.生成示例数据
options(stringsAsFactors = F)
set.seed(4)
df = data.frame(s1=sample(c("+","-"),10,replace = T),
s2=sample(c("+","-"),10,replace = T),
s3=sample(c("+","-"),10,replace = T))
head(df)
#> s1 s2 s3
#> 1 - - -
#> 2 + + -
#> 3 + + -
#> 4 + - +
#> 5 - + -
#> 6 + + -
2.写条件
以一行的前三列为输入数据,我们取第一行作为示例:
test=as.character(df[1,])
test
#> [1] "-" "-" "-"
所以根据要求,写出三个条件
(test[1]=="+")&(test[2]=="+")&(test[3]=="+")
#> [1] FALSE
((test[1]=="+")|(test[2]=="+"))&(test[3]=="-")
#> [1] FALSE
(test[1]=="-")&(test[2]=="-")&(test[3]=="-")
#> [1] TRUE
其他情况都是else
3.条件语句
(1)几段论的if语句
if ((test[1]=="+")&(test[2]=="+")&(test[3]=="+")) {
print("B")
} else if(((test[1]=="+")|(test[2]=="+"))&(test[3]=="-")){
print("A")
} else if((test[1]=="-")&(test[2]=="-")&(test[3]=="-")){
print("TNBC")
} else{
print("H")
}
#> [1] "TNBC"
(2)几层嵌套的ifelse函数
关于这个函数的讲解请看:
y= ifelse((test[1]=="+")&(test[2]=="+")&(test[3]=="+"),
"B",
ifelse(((test[1]=="+")|(test[2]=="+"))&(test[3]=="-"),
"A",
ifelse((test[1]=="-")&(test[2]=="-")&(test[3]=="-"),
"TNBC","H")))
4.写成函数
条件只有三四个,用ifelse挺好的。
pd = function(test){
ifelse((test[1]=="+")&(test[2]=="+")&(test[3]=="+"),
"B",
ifelse(((test[1]=="+")|(test[2]=="+"))&(test[3]=="-"),
"A",
ifelse((test[1]=="-")&(test[2]=="-")&(test[3]=="-"),
"TNBC","H")))
}
pd(test)
#> [1] "TNBC"
5.apply走起
apply(df,1,pd)
#> [1] "TNBC" "A" "A" "H" "A" "A" "H" "TNBC" "TNBC" "A"
6.拯救小郭
将apply的结果加在数据框最后就好了
df$s4 <- apply(df,1,pd)
head(df)
#> s1 s2 s3 s4
#> 1 - - - TNBC
#> 2 + + - A
#> 3 + + - A
#> 4 + - + H
#> 5 - + - A
#> 6 + + - A
向大家隆重推荐隔壁生信技能树的一系列干货!
点击底部的“阅读原文”,获得更好的阅读体验哦😻
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到jieandze1314@gmail.com,每一条都会看到的哦~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!