vlambda博客
学习文章列表

R语言 文本检索入门

还是上一批数据,有一些影像学结果。以非结构化的形式呈现。


数据处理目的:

将影像学结果的非结构化数据转换为结构化数据,确定某个对象是否患有某病。


本来数据是这样子的(总共有12列为影像学指标,我想从12列的文本中判断是否患有某种疾病):


我想转换成这样子,1代表有,0代表没有

R语言 文本检索入门


一、导入数据

不展示了,setwd()和read.csv()两个步骤,之前已经展示过


二、创建想要筛查的疾病,作为一个字符串,此处举例:胆囊结石


string <- c("胆囊结石")


三、搜索文本,使用grepl()函数


该函数的意思,大概就是说,在一个向量中查找一串字符串。有就输出为1(TRUE),没有就输出为0(FALSE)


先试试水,找一个两个试一下,确认函数没有问题:

grepl(string, data[1,2])grepl(string, data[5896,2])

得到以下结果:


R语言 文本检索入门


查看了一下,没有问题。开始码循环。


四、创建一个空的数据框承接循环结果


此处,选择第一列为ID,第2-12列为原始数据2-12列的搜索结果

jieguo <- data.frame(ID= character(), N2 = numeric(), N3 = numeric(), N4 = numeric(), N5 = numeric(), N6 = numeric(), N7 = numeric(), N8 = numeric(), N9 = numeric(), N10 = numeric(), N11 = numeric(), N12 = numeric(), stringsAsFactors=FALSE)


五、正式跑循环


此时的i代表的是行数,此时是对每个对象操作。

for (i in c(1:11380)){ jieguo[i,2] <- grepl(string, data[i,2]) jieguo[i,3] <- grepl(string, data[i,3]) jieguo[i,4] <- grepl(string, data[i,4]) jieguo[i,5] <- grepl(string, data[i,5]) jieguo[i,6] <- grepl(string, data[i,6]) jieguo[i,7] <- grepl(string, data[i,7]) jieguo[i,8] <- grepl(string, data[i,8]) jieguo[i,9] <- grepl(string, data[i,9]) jieguo[i,10] <- grepl(string, data[i,10]) jieguo[i,11] <- grepl(string, data[i,11]) jieguo[i,12] <- grepl(string, data[i,12])}


加上第一列的ID,把data的第一列挪过来就好了

jieguo[,1] <- data[,1]


结果如下:



六、将12列的数据进行整合


此处选择计数,并将结果放到第13列

for (i in c(1:11380)){ jieguo[i,13] <- sum(jieguo[i,2:12])}

此时,13列的结果就是我们要的结果了。排一下序:


发现胆囊结石这个词在一个对象中最多出现在了3列中。

现在是定量,如果定性的话,再加一个判断就行了。不操作了。


七、如果想要搜索多个字符串,怎么办?


创建字符串的时候,选择|符号表示或即可。其余步骤一样。

string <- c("慢性胃炎|胆囊结石")


八、对多种疾病同时检索?直接加一个大循环,代码放这里了,详细就不说了。

# 疾病种类,请一个个输入# 输入疾病string <- c("胆囊结石","慢性胃炎","胆囊结石|慢性胃炎")
# 创建一个空数据框承接所有结果zong <- data.frame(jibingming= numeric(), stringsAsFactors=FALSE)# x为string的字符串个数for (x in c(1:3)){ # 创建空矩阵 jieguo <- data.frame(ID= character(), N2 = numeric(), N3 = numeric(), N4 = numeric(), N5 = numeric(), N6 = numeric(), N7 = numeric(), N8 = numeric(), N9 = numeric(), N10 = numeric(), N11 = numeric(), N12 = numeric(), stringsAsFactors=FALSE) for (i in c(1:11380)){ jieguo[i,2] <- grepl(string[x], data[i,2]) jieguo[i,3] <- grepl(string[x], data[i,3]) jieguo[i,4] <- grepl(string[x], data[i,4]) jieguo[i,5] <- grepl(string[x], data[i,5]) jieguo[i,6] <- grepl(string[x], data[i,6]) jieguo[i,7] <- grepl(string[x], data[i,7]) jieguo[i,8] <- grepl(string[x], data[i,8]) jieguo[i,9] <- grepl(string[x], data[i,9]) jieguo[i,10] <- grepl(string[x], data[i,10]) jieguo[i,11] <- grepl(string[x], data[i,11]) jieguo[i,12] <- grepl(string[x], data[i,12]) } for (j in c(1:11380)){ zong[j,x] <- sum(jieguo[j,2:12]) }}
names(zong) <- string# 然后可以保存了



什么时候用python做一下,应该也不难。但是我python太差了啊T T