杀杀
最近学了几个矩阵批量替换的阳间方法,拒绝for循环!
应用:数据格式的标准化
以前我做的时候会用excel,或者在R中一列一列地进行替换,使用which之类的函数。
但是当我们需要批量替换的时候,可以使用更方便的方法:
Replace
首先是do包中的Replace函数
我想要把我数据中所有的"Primary","Female","Wildtype","Non-codel","un-methylated"都统一换成0,表示一种野生型/对照的状态
另外,数据中所有的"Recurrent","Secondary","Male","Mutant","Codel","methylated"都统一换成1,表示一种突变型的状态
library(do)
CGGA_325_clinical1 <- Replace(data=CGGA_325_clinical,from = c("Primary","Female","Wildtype","Non-codel","un-methylated"),to = 0)
CGGA_325_clinical2 <- Replace(data=CGGA_325_clinical1,from = c("Recurrent","Secondary","Male","Mutant","Codel","methylated"),to = 1)
注意替换的时候可以把原矩阵赋值给新的一个对象,以免覆盖错误导致原始信息丢失。另外最好是留下最初的矩阵,以便进行检查。
另外,需要特别注意!
Replace这个函数针对的是字符串对象,也就是说它识别的是字符串而不是矩阵或者list,这导致了重复识别的可能。比如我们有两个值‘A’,和‘NA’,这两个本身代表的是完全不同的意义,如果你先将A替换为1,然后想将NA替换为0,在代码运行时,函数会将NA里的A也替换成1,这样你的所有NA会变成N1,这样会导致后面的操作无法进行。
因此我们需要进行类似excel中“单元格匹配“的操作,也就是只有当我的字符完全匹配的时候才进行替换,我们可以使用正则表达式进行,就是在字符前后加上^和$
test_data1 <- Replace(data=test_data,from = c("^\\(-)$","^F$","^wt$","^no loss$","^Un-Met$"),to = 0)
注意举例里的"^\(-)",因为括号和加号都是正则表达式,都需要加上\避免系统错误识别。
类似的大家可以举一反三地写代码。
还有更重要的是!
在使用这个函数进行批量替换过后,它会自动把矩阵全部变成字符型(所以如果你需要在这个矩阵中进行加减乘除的操作请在批量替换前做):这时候直接as.numeric强制转换成数值型,会导致我想保留的字符(比如3,4列)变成NA,把刚刚转成01的再一列列换回数值型也太无聊了,所以我一般会这么做
write.csv(test_data3,"japan_test_temp.csv",row.names = F,quote = F)
test_data3_deal <- read.csv("test_data3_temp.csv",header = T)
把数据写出去,quote=F,再读进来。其实这个方法是有好处的,首先,当你下次想使用这个数据的时候,你就不用从头处理了,只需要读入你这次写出的数据,其次将数据写出也有利于溯源。马上变成你想要的样子~
mutate
另外一种需求是,比如说我有一列代表等级,原始的等级用希腊数字I, II, III, IV表示,我需要分别替换成1,2,3,4 这时候需要用到另一个函数mutate
library(tidyverse)
CGGA_325_clinical3 <- CGGA_325_clinical2%>%
mutate(grade=recode(grade,"WHO I"="1","WHO II"="2","WHO III"="3","WHO IV"="4"))%>%
mutate(grade=as.numeric(grade))
我们这边使用管道操作,把四个需要替换的字符换成数值。
祝大家天天开心~