R语言写不出来啊!R优质资源

R语言 矩阵批量替换

2021-05-21  本文已影响0人  不会生信哟

杀杀

最近学了几个矩阵批量替换的阳间方法,拒绝for循环!

应用:数据格式的标准化

我们在处理临床随访文件时,医生们通常会这样记录: 但是我们如果要进行生存分析或者风险分析或者其它一系列的训练-验证处理,都需要对数据进行一个标准化,把这些不统一的字符统一成计算机能够识别/区分的字符,比如0/1,或者连续型的数值。这时候我们需要批量替换。

以前我做的时候会用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))

我们这边使用管道操作,把四个需要替换的字符换成数值。

祝大家天天开心~

上一篇下一篇

猜你喜欢

热点阅读