R语言 文本检索入门
还是上一批数据,有一些影像学结果。以非结构化的形式呈现。
数据处理目的:
将影像学结果的非结构化数据转换为结构化数据,确定某个对象是否患有某病。
本来数据是这样子的(总共有12列为影像学指标,我想从12列的文本中判断是否患有某种疾病):
我想转换成这样子,1代表有,0代表没有
一、导入数据
不展示了,setwd()和read.csv()两个步骤,之前已经展示过
二、创建想要筛查的疾病,作为一个字符串,此处举例:胆囊结石
string <- c("胆囊结石")
三、搜索文本,使用grepl()函数
该函数的意思,大概就是说,在一个向量中查找一串字符串。有就输出为1(TRUE),没有就输出为0(FALSE)
先试试水,找一个两个试一下,确认函数没有问题:
grepl(string, data[1,2])
grepl(string, data[5896,2])
得到以下结果:
查看了一下,没有问题。开始码循环。
四、创建一个空的数据框承接循环结果
此处,选择第一列为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)
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