來自一個師兄的提問:
想做中藥成分復(fù)方藥物分析的K-Means 聚類,如何快速進行模糊標(biāo)準(zhǔn)化?
實現(xiàn)要求:
手頭有270個復(fù)方,然后有118味興趣藥物,想研究復(fù)方中出現(xiàn)興趣藥物的情況。如果復(fù)方的藥物出現(xiàn)在研究的興趣藥物中,則標(biāo)1,否則標(biāo)0。把每個復(fù)方轉(zhuǎn)換成只有“1”和“0”的表格數(shù)據(jù)。
目標(biāo)效果

image.png
參考文獻:劉廣, 孫艷秋. 基于K-Means聚類算法的消渴方劑研究 [J]. 中華中醫(yī)藥學(xué)刊, 2017(1):173-178,共6頁.
怎么辦?
嗯,對于我這種EXCEL并不會用的人來說,最簡單的想法就是自己做個表格,慢慢匹配咯。然后手動根據(jù)匹配結(jié)果,輸入”0“和”1“咯,但是這也絕望了吧,270個方劑,平均有一個方15個藥物,我要核對15×270=4050次,對表格進行118×270=31860次的重復(fù)輸入。
這太難了~
R語言解決方法
當(dāng)一個數(shù)據(jù)處理的操作需要重復(fù)操作3次以上,那么這樣的操作應(yīng)該可以通過編程解決掉它~
幸虧會一點R語言,這個需求實現(xiàn)起來還是比較簡單的,一個for循環(huán)就搞定了~
下面展示下出來步驟~
1.數(shù)據(jù)準(zhǔn)備
處方匯總表×1:

image.png
研究的興趣藥物列表×1
原數(shù)據(jù)有118個,限于截圖這里展示一部分。

image.png
2.寫個循環(huán)解決它
Talk is cheap, so let me show you the codes.
#1.載入需要的包
options(stringsAsFactors = F)
library(tidyverse)
library(openxlsx)
#2.導(dǎo)入處方數(shù)據(jù)
prescription_all <- read.xlsx("處方匯總.xlsx",sheet = 1,colNames =T)
#刪掉第一列,整理下
prescription_all <- prescription_all %>%
.[,-1] %>% t() #共270個處方
prescription_all <- as.data.frame(prescription_all )
##3.導(dǎo)入要篩選的藥物
herb_all <- read.xlsx("整理藥物名錄.xlsx",sheet =1,colNames = F)
herb_all <- herb_all$X1
##4.寫個循環(huán)操作下
output <- list()
for (i in 1:ncol(prescription_all)) {
print(i)
output[[i]] <- herb_all%in%na.omit(prescription_all[,i])
}
#5.合并并修改名稱
out_data <- do.call(rbind,output)
out_data <- apply(out_data, 2, as.numeric) %>%
as.data.frame()
colnames(out_data) <- herb_all
rownames(out_data) <- paste0("處方",1:270)
#####6.驗證
sort(prescription_all$`2` %>%
na.omit())
sort(herb_all[out_data[2,]==1])
##7.輸出,收工~
out_data$"處方名" <- rownames(out_data)
out_data <- select(out_data,"處方名",everything())
write.xlsx(out_data,"藥物整理數(shù)據(jù).xlsx")
輸出結(jié)果:

image.png
耗時計算:

image.png
人工跑斷腿,R語言循環(huán)只要1秒鐘~
不知道大家有沒有這樣的需求,拋磚引玉,提供下參考~