我精通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给出的文本代码=代码(主题)
文件名=文本的文件名(本例中为日记条目的日期)
index1 =字符在开始代码的文件中的位置(突出显示的文本)
index2 =字符在代码结束的文件中的位置(突出显示的文本)
CodingLength =编码/突出显示文本的总长度
我想要做的是遍历整个表(大约1,500行),使用代码的总列表(上表中的代码名,大约100个唯一的代码),以便输出代码之间重叠的双向矩阵,例如(仅指示性的,有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 *(代码在这个输出上有点混乱,但希望您能理解)
因此,在R中,我需要一些代码来迭代代码列表,并计算A)文件名相同和B)在index1和index2之间的范围内重叠的实例数(CodingLength可能并不重要)。
除了以下几个模糊的预感之外,我对如何使这一工作感到迷惑不解:
基于此,有没有人能找到一种很短的解决方案呢?我觉得python中的等价物最多是10行,但考虑到R中所需的额外位数,我完全不知道如何做到这一点。
发布于 2016-11-07 19:50:03
您可以在foverlap包中使用data.table函数创建一个edgelist,然后将其转换为一个加权邻接矩阵。(见这里)。
使用data.table、dplyr和igraph的组合,我认为这可以满足您的需要(但是,没有数据是无法验证的)。
首先,将数据帧设置为数据表,并设置index1和index2的键。然后,foverlap标识条目,其中index1和index2有任何重叠。消除自重叠后,将foverlaps生成的ids替换为来自数据集的相应代码名。这就创造了一个边缘学家。将此编辑传递给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是完全可选的;管道使它更加整洁,避免在环境中创建更多的对象。
发布于 2016-11-08 14:57:30
另一种似乎有效的方法,我理解你的描述。
使用"IRanges“包查找重叠:
fo = findOverlaps(IRanges(dat$index1, dat$index2))检查重叠区域是否属于相同的“文件名”:
i = dat$filename[queryHits(fo)] == dat$filename[subjectHits(fo)]并且,为重叠的"index1“和"index2”列出“代码名”,它们属于同一个“文件名”:
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 3https://stackoverflow.com/questions/40470933
复制相似问题