R

时间:2016-11-07 17:22:31

标签: r matrix adjacency-matrix text-analysis

我精通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可能不重要) )。

除了以下模糊的预感外,我对于如何完成这项工作感到迷茫:

  1. 我可能需要将表格作为变量,例如:

    coding_table< - getCodingTable()

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

    x = c(“丝绸”,“棉花”,“编织”,“缝制”,“午餐”......等)

  3. 我需要一个执行检查的功能

  4. 我需要行的for循环
  5. 我需要一个布尔测试,其中检查范围和文件名,例如任何(409:939%in%727:939)&& filename == filename
  6. 基于此,有人能看到一种方法来制作一个非常简短的解决方案吗?我觉得python中的等价物最多可以是10行,但考虑到R中需要的额外位,我完全不知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

您可以使用foverlap包中的data.table函数创建边缘列表,然后将其转换为加权邻接矩阵。 (见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完全是可选的;管道只是使它更整洁,避免在环境中创造更多的物体。

答案 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