【问题标题】:Coding Matrix with overlap counts in RR中具有重叠计数的编码矩阵
【发布时间】:2016-11-07 17:22:30
【问题描述】:

我精通 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

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

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

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

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

CodingLength = 编码/突出显示文本的总长度

我想做的是用代码的总列表(上表中的代号,大约 100 个唯一代码)遍历整个表(大约 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. 我可能需要将表格指定为变量,例如:

    coding_table

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

    x = c("丝绸","棉花","织布","缝纫","午餐" ...等)

  3. 我需要一个执行检查的函数

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

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

【问题讨论】:

  • 注:如果有人可以创建标签“RQDA”,我会这样标记。

标签: r matrix adjacency-matrix text-analysis


【解决方案1】:

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

使用data.tabledplyrigraph 的组合,我认为这可以得到你想要的(虽然没有数据无法验证)。

首先,您将数据框设置为数据表,并为 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 是完全可选的;管道只是让它更整洁,并避免在环境中创建更多对象。

【讨论】:

  • 嗨 - 这是一个很好的答案,似乎除了一个主要问题之外基本上可以工作......它没有考虑不同的文件名(参见顶部的示例数据)。它仅将代号视为基于 index1 和 index2 的重叠......但它也需要考虑“文件名”/“fid”,因为(例如)两个具有重叠 index1 和 index2 值的代号不会重叠,除非“文件名”/ 'fid' 也是相同的(即这些范围在同一个文件中重叠)...是否可以修改您的答案以考虑到这一点?
  • 为我澄清一件事:你想要每个文件都有一个单独的邻接矩阵吗?还是一个整体,每个文件的代码分别表示?
  • 整个批次只有一个邻接矩阵,但是如果两个文件名相同并且 index1/index2 在范围内重叠(这基本上是一个带有文件名/fid 的大日记),则代号仅被视为重叠对于每一天,因此要使代号重叠,它必须位于同一字符范围内的文本上 - index1 和 index2 - 并且是同一天)。
  • 例如在上面的数据中,第 1 行和第 6 行重叠(参见 index1/2),但第 4 行和第 8 行没有(因为虽然 index1/2 重叠,但它们不在同一天)。因此,在这些情况下,“丝绸”(1) 和“成本”(6) 得分 1 重叠,但“缝纫”(4) 和“午餐”(8) 不会得分重叠,因为它们在不同的日子被提及并且是因此在不同的文件 (fid) 中。
  • 知道了。尝试将setKey 更改为setkey(setDT(coding_table), filename, index1, index2)。这应该够了吧。查不出来。哦,因为不在我的电脑上,但我认为应该可以。
【解决方案2】:

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

使用“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       3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多