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 可能不重要)。
除了以下模糊的预感之外,我不知道如何进行这项工作:
我可能需要将 table 指定为变量,例如:
coding_table <- getCodingTable()
我可能需要列出唯一变量,例如:
x = c("silk","cotton","weaving","sewing","lunch" ...等)
我需要一个函数来进行检查
- 我需要一个用于行的 for 循环
- 我需要一个布尔测试,其中检查范围和文件名,例如任何(409:939 %in% 727:939) && 文件名== 文件名
基于此,任何人都可以找到一种方法来对此产生一个非常简短的解决方案吗?我觉得 python 中的等效项最多为 10 行,但考虑到 R 中所需的额外位,我完全不知道如何执行此操作。
您可以使用 data.table
包中的 foverlap
函数来创建边列表,然后将其转换为加权邻接矩阵。 (参见 )。
结合使用 data.table
、dplyr
和 igraph
,我认为这可以满足您的需求(不过没有数据无法验证)。
首先,将数据框设置为数据 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
我精通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 可能不重要)。
除了以下模糊的预感之外,我不知道如何进行这项工作:
我可能需要将 table 指定为变量,例如:
coding_table <- getCodingTable()
我可能需要列出唯一变量,例如:
x = c("silk","cotton","weaving","sewing","lunch" ...等)
我需要一个函数来进行检查
- 我需要一个用于行的 for 循环
- 我需要一个布尔测试,其中检查范围和文件名,例如任何(409:939 %in% 727:939) && 文件名== 文件名
基于此,任何人都可以找到一种方法来对此产生一个非常简短的解决方案吗?我觉得 python 中的等效项最多为 10 行,但考虑到 R 中所需的额外位,我完全不知道如何执行此操作。
您可以使用 data.table
包中的 foverlap
函数来创建边列表,然后将其转换为加权邻接矩阵。 (参见
结合使用 data.table
、dplyr
和 igraph
,我认为这可以满足您的需求(不过没有数据无法验证)。
首先,将数据框设置为数据 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