我精通Python但在R中是一个完整的新手。我无法在网上找到这个问题的答案,虽然它会有点冗长,但我希望它对其他用户有用。 R库RQDA。
基本上,RQDA是一种定性研究工具,主要用于为文本文件分配代码(主题)。它有点像荧光笔,它可以计算突出显示的位置。
如果您输入了大量文件,您可以使用主题在不同位置对文本进行编码(例如,关于采访布料制造工作人员的项目可能是“设备”,“缝纫”,“亚麻布”,“丝绸” ,“照明”,“午餐休息”等)。这使您可以计算使用不同代码的次数,在RQDA中,它提供如下表格输出:
rowid cid fid codenamefilename index1 index2 CodingLength
1 1 12 1 silk 2010-01-28 409 939 530
2 2 21 1 cotton 2010-01-28 1008 1172 164
3 3 12 1 silk 2010-01-28 1173 1924 751
4 4 39 1 sewing 2010-01-28 1008 1250 751
5 5 38 1 weaving 2010-01-28 1173 1924 751
6 6 78 1 costs 2010-01-28 727 939 212
7 7 23 1 lunch 2010-01-28 1553 1788 235
8 9 7 2 lunch 2010-01-29 1001 1230 371
9 10 4 2 weaving 2010-01-29 1547 1724 135
10 11 6 2 social 2010-01-29 1001 1290 350
11 12 7 2 silk 2010-01-29 1926 2276 350
12 14 17 2 supply 2010-01-29 1926 2276 350
13 15 78 2 costs 2010-01-29 1926 2276 350
14 17 78 2 weaving 2010-01-29 1890 2106 212
代号=给出文字的代码(主题)
filename =文本的文件名(在本例中为日记条目的日期)
index1 =代码启动的文件中的字符位置(突出显示的文本)
index2 =代码结束的文件中的字符位置(突出显示的文本)
CodingLength =编码/突出显示文本的总长度
我想做的是用整个代码列表(上表中的代号,大约100个唯一代码)遍历整个表(大约1,500行),以便输出双向矩阵例如,代码之间的重叠(仅指示,具有5个代码):
silk cotton sewing weaving lunch breaks socialising
silk * 0 0 3 2 0
cotton 0 * 5 0 0 0
sewing 0 5 * 0 0 0
weaving 3 0 0 * 0 0
lunchs 2 0 0 0 * 5
socialg 0 0 0 0 5 *
(代码搞砸了这个输出,但希望你能得到这个想法)
因此,在RI中需要一些代码来迭代代码列表并计算A)文件名相同的实例数量,B)index1和index2之间的范围内有重叠(CodingLength可能不重要) )。
除了以下模糊的预感外,我对于如何完成这项工作感到迷茫:
我可能需要将表格作为变量,例如:
coding_table< - getCodingTable()
我可能需要列出唯一变量,例如:
x = c(“丝绸”,“棉花”,“编织”,“缝制”,“午餐”......等)
我需要一个执行检查的功能
基于此,有人能看到一种方法来制作一个非常简短的解决方案吗?我觉得python中的等价物最多可以是10行,但考虑到R中需要的额外位,我完全不知道如何做到这一点。
答案 0 :(得分:2)
您可以使用foverlap
包中的data.table
函数创建边缘列表,然后将其转换为加权邻接矩阵。 (见here)。
使用data.table
,dplyr
和igraph
的组合,我认为这可以为您提供所需(无法在没有数据的情况下进行验证)。
首先,将数据框设置为数据表,并设置index1和index2的键。然后,foverlap
标识其中index1和index2有任何重叠的条目。消除自重叠后,将foverlaps生成的id替换为数据集中的相应代号。这会创建一个边缘列表。将此边缘列表传递给igraph以创建igraph对象并将其作为邻接矩阵返回。
require(igraph); require(data.table); require(dplyr)
el <- setkey(setDT(coding_table), filename, index1, index2) %>%
foverlaps(., ., type="any", which=TRUE) %>%
.[coding_table$codename[xid] != coding_table$codename[yid]] %>%
.[, `:=`(xid = coding_table$codename[xid], yid = coding_table$codename[yid])]
m <- as.matrix(get.adjacency(graph.data.frame(el)))
当然,dplyr
完全是可选的;管道只是使它更整洁,避免在环境中创造更多的物体。
答案 1 :(得分:2)
另一种似乎有效的方法,因为我理解你的描述。
使用&#34; IRanges&#34;查找重叠包:
fo = findOverlaps(IRanges(dat$index1, dat$index2))
检查重叠范围是否属于相同的&#34;文件名&#34;:
i = dat$filename[queryHits(fo)] == dat$filename[subjectHits(fo)]
并列出&#34;代号&#34;对于重叠的&#34; index1&#34;和&#34; index2&#34;属于同一个&#34;文件名&#34;:
table(dat$codename[queryHits(fo)[i]], dat$codename[subjectHits(fo)[i]])
#
# costs cotton lunch sewing silk social supply weaving
# costs 2 0 0 0 2 0 1 1
# cotton 0 1 0 1 0 0 0 0
# lunch 0 0 2 0 1 1 0 1
# sewing 0 1 0 1 1 0 0 1
# silk 2 0 1 1 3 0 1 2
# social 0 0 1 0 0 1 0 0
# supply 1 0 0 0 1 0 1 1
# weaving 1 0 1 1 2 0 1 3