来自一个师兄的提问:
想做中药成分复方药物分析的K-Means 聚类,如何快速进行模糊标准化?
实现要求:
手头有270个复方,然后有118味兴趣药物,想研究复方中出现兴趣药物的情况。如果复方的药物出现在研究的兴趣药物中,则标1,否则标0。把每个复方转换成只有“1”和“0”的表格数据。
目标效果
image.png参考文献:刘广, 孙艳秋. 基于K-Means聚类算法的消渴方剂研究 [J]. 中华中医药学刊, 2017(1):173-178,共6页.
怎么办?
嗯,对于我这种EXCEL并不会用的人来说,最简单的想法就是自己做个表格,慢慢匹配咯。然后手动根据匹配结果,输入”0“和”1“咯,但是这也绝望了吧,270个方剂,平均有一个方15个药物,我要核对15×270=4050次,对表格进行118×270=31860次的重复输入。
这太难了~
R语言解决方法
当一个数据处理的操作需要重复操作3次以上,那么这样的操作应该可以通过编程解决掉它~
幸亏会一点R语言,这个需求实现起来还是比较简单的,一个for循环就搞定了~
下面展示下出来步骤~
1.数据准备
处方汇总表×1:
image.png
研究的兴趣药物列表×1
原数据有118个,限于截图这里展示一部分。
image.png
2.写个循环解决它
Talk is cheap, so let me show you the codes.
#1.载入需要的包
options(stringsAsFactors = F)
library(tidyverse)
library(openxlsx)
#2.导入处方数据
prescription_all <- read.xlsx("处方汇总.xlsx",sheet = 1,colNames =T)
#删掉第一列,整理下
prescription_all <- prescription_all %>%
.[,-1] %>% t() #共270个处方
prescription_all <- as.data.frame(prescription_all )
##3.导入要筛选的药物
herb_all <- read.xlsx("整理药物名录.xlsx",sheet =1,colNames = F)
herb_all <- herb_all$X1
##4.写个循环操作下
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,"药物整理数据.xlsx")
输出结果:
image.png耗时计算:
image.png人工跑断腿,R语言循环只要1秒钟~
不知道大家有没有这样的需求,抛砖引玉,提供下参考~
网友评论