R 中具有重叠计数的编码矩阵

Coding Matrix with overlap counts in R

我精通Python,但在 R 方面完全是个新手。我无法在网上其他地方找到这个问题的答案,虽然它会有点长,但我希望它会是对 R 库的其他用户有用 RQDA.

本质上,RQDA 是一种定性研究工具,主要用于将代码(主题)分配给文本文件。这有点像荧光笔,它会计算它突出显示的位置。

如果你放入很多文件,你可以在不同的地方用主题对文本进行编码(例如,一个关于采访在布料制造行业工作的人的项目可能是 "equipment"、"sewing"、"linen"、"silk"、"lighting"、"lunch breaks" 等)。这使您能够计算不同代码被使用的次数,并且在 RQDA 中它给出如下 table 输出:

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

codename = 给文本的代码(主题)

filename = 文本的文件名(在本例中为日记条目的日期)

index1 = 文件中代码开始的字符位置(突出显示的文本)

index2 = 文件中代码结束的字符位置(突出显示的文本)

CodingLength = coded/highlighted 文本的总长度

我想做的是用整个代码列表(上面 table 中的代号,大约 100 个唯一代码)遍历整个 table(大约 1,500 行)为了输出代码之间重叠的 2 路矩阵,例如(仅指示性,有 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 可能不重要)。

除了以下模糊的预感之外,我不知道如何进行这项工作:

  1. 我可能需要将 table 指定为变量,例如:

    coding_table <- getCodingTable()

  2. 我可能需要列出唯一变量,例如:

    x = c("silk","cotton","weaving","sewing","lunch" ...等)

  3. 我需要一个函数来进行检查

  4. 我需要一个用于行的 for 循环
  5. 我需要一个布尔测试,其中检查范围和文件名,例如任何(409:939 %in% 727:939) && 文件名== 文件名

基于此,任何人都可以找到一种方法来对此产生一个非常简短的解决方案吗?我觉得 python 中的等效项最多为 10 行,但考虑到 R 中所需的额外位,我完全不知道如何执行此操作。

您可以使用 data.table 包中的 foverlap 函数来创建边列表,然后将其转换为加权邻接矩阵。 (参见 )。

结合使用 data.tabledplyrigraph,我认为这可以满足您的需求(不过没有数据无法验证)。

首先,将数据框设置为数据 table 并为 index1 和 index2 设置键。然后,foverlap 标识 index1 和 index2 有任何重叠的条目。消除自重叠后,将 foverlaps 生成的 ids 替换为数据集中相应的代号。这将创建一个边缘列表。将此边缘列表传递给 igraph 以创建一个 igraph 对象并将其 return 作为邻接矩阵。

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完全是可选的;管道只是让它更整洁一点,避免在环境中创建更多对象。

据我了解您的描述,另一种似乎有效的方法。

使用 "IRanges" 包查找重叠:

fo = findOverlaps(IRanges(dat$index1, dat$index2))

检查重叠的范围是否属于同一个"filename":

i = dat$filename[queryHits(fo)] == dat$filename[subjectHits(fo)]

然后,将重叠的 "index1" 和属于同一 "filename" 的 "index2" 制表 "codename":

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