美文网首页小白的数据分析学习
一分钟数据清洗: K-Means 聚类的模糊标准化

一分钟数据清洗: K-Means 聚类的模糊标准化

作者: 村野孤云 | 来源:发表于2019-12-28 13:46 被阅读0次

来自一个师兄的提问:
想做中药成分复方药物分析的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秒钟~
不知道大家有没有这样的需求,抛砖引玉,提供下参考~

相关文章

网友评论

    本文标题:一分钟数据清洗: K-Means 聚类的模糊标准化

    本文链接:https://www.haomeiwen.com/subject/nolsoctx.html