R語(yǔ)言 矩陣批量替換

殺殺

最近學(xué)了幾個(gè)矩陣批量替換的陽(yáng)間方法,拒絕for循環(huán)!

應(yīng)用:數(shù)據(jù)格式的標(biāo)準(zhǔn)化

我們?cè)谔幚砼R床隨訪文件時(shí),醫(yī)生們通常會(huì)這樣記錄:
但是我們?nèi)绻M(jìn)行生存分析或者風(fēng)險(xiǎn)分析或者其它一系列的訓(xùn)練-驗(yàn)證處理,都需要對(duì)數(shù)據(jù)進(jìn)行一個(gè)標(biāo)準(zhǔn)化,把這些不統(tǒng)一的字符統(tǒng)一成計(jì)算機(jī)能夠識(shí)別/區(qū)分的字符,比如0/1,或者連續(xù)型的數(shù)值。這時(shí)候我們需要批量替換。

以前我做的時(shí)候會(huì)用excel,或者在R中一列一列地進(jìn)行替換,使用which之類的函數(shù)。
但是當(dāng)我們需要批量替換的時(shí)候,可以使用更方便的方法:

Replace

首先是do包中的Replace函數(shù)
我想要把我數(shù)據(jù)中所有的"Primary","Female","Wildtype","Non-codel","un-methylated"都統(tǒng)一換成0,表示一種野生型/對(duì)照的狀態(tài)
另外,數(shù)據(jù)中所有的"Recurrent","Secondary","Male","Mutant","Codel","methylated"都統(tǒng)一換成1,表示一種突變型的狀態(tài)

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)

注意替換的時(shí)候可以把原矩陣賦值給新的一個(gè)對(duì)象,以免覆蓋錯(cuò)誤導(dǎo)致原始信息丟失。另外最好是留下最初的矩陣,以便進(jìn)行檢查。

另外,需要特別注意!

Replace這個(gè)函數(shù)針對(duì)的是字符串對(duì)象,也就是說(shuō)它識(shí)別的是字符串而不是矩陣或者list,這導(dǎo)致了重復(fù)識(shí)別的可能。比如我們有兩個(gè)值‘A’,和‘NA’,這兩個(gè)本身代表的是完全不同的意義,如果你先將A替換為1,然后想將NA替換為0,在代碼運(yùn)行時(shí),函數(shù)會(huì)將NA里的A也替換成1,這樣你的所有NA會(huì)變成N1,這樣會(huì)導(dǎo)致后面的操作無(wú)法進(jìn)行。

因此我們需要進(jìn)行類似excel中“單元格匹配“的操作,也就是只有當(dāng)我的字符完全匹配的時(shí)候才進(jìn)行替換,我們可以使用正則表達(dá)式進(jìn)行,就是在字符前后加上^和$

test_data1 <- Replace(data=test_data,from = c("^\\(-)$","^F$","^wt$","^no loss$","^Un-Met$"),to = 0)

注意舉例里的"^\(-)",其實(shí)我想替換的是(-),而不是\\(-),之所以加上\\是因?yàn)槔ㄌ?hào)()也是正則表達(dá)式,因此我們需要加上\\去避免系統(tǒng)識(shí)別其為正則表達(dá)式。 因此當(dāng)我們替換(+)這個(gè)符號(hào)時(shí),需要寫(xiě)的式子是"^\\(\\+)",因?yàn)槔ㄌ?hào)和加號(hào)都是正則表達(dá)式,都需要加上\避免系統(tǒng)錯(cuò)誤識(shí)別。
類似的大家可以舉一反三地寫(xiě)代碼。

還有更重要的是!

在使用這個(gè)函數(shù)進(jìn)行批量替換過(guò)后,它會(huì)自動(dòng)把矩陣全部變成字符型(所以如果你需要在這個(gè)矩陣中進(jìn)行加減乘除的操作請(qǐng)?jiān)谂刻鎿Q前做):

這時(shí)候直接as.numeric強(qiáng)制轉(zhuǎn)換成數(shù)值型,會(huì)導(dǎo)致我想保留的字符(比如3,4列)變成NA,把剛剛轉(zhuǎn)成01的再一列列換回?cái)?shù)值型也太無(wú)聊了,所以我一般會(huì)這么做

write.csv(test_data3,"japan_test_temp.csv",row.names = F,quote = F)
test_data3_deal <- read.csv("test_data3_temp.csv",header = T)

把數(shù)據(jù)寫(xiě)出去,quote=F,再讀進(jìn)來(lái)。其實(shí)這個(gè)方法是有好處的,首先,當(dāng)你下次想使用這個(gè)數(shù)據(jù)的時(shí)候,你就不用從頭處理了,只需要讀入你這次寫(xiě)出的數(shù)據(jù),其次將數(shù)據(jù)寫(xiě)出也有利于溯源。

馬上變成你想要的樣子~

mutate

另外一種需求是,比如說(shuō)我有一列代表等級(jí),原始的等級(jí)用希臘數(shù)字I, II, III, IV表示,我需要分別替換成1,2,3,4 這時(shí)候需要用到另一個(gè)函數(shù)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))

我們這邊使用管道操作,把四個(gè)需要替換的字符換成數(shù)值。

祝大家天天開(kāi)心~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容