2016-11-07 24 views
1

我精通Python,但在R完全新手。我無法找到這個問題的答案在其他地方在線,雖然它會有點冗長,但我希望它會對R庫RQDA的其他用戶有用。編碼矩陣與重疊計數在R

本質上,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之間=字符位置代碼開始(突出顯示的文本)

索引2 =字符位置在檔案中,其中代碼端(突出顯示的文本)

CodingLength =的編碼全長/突出顯示的文本

我想要做的是在整個表(約1500行)與代碼在上述表中的總列表(代號迭代,大約100唯一代碼),以輸出代碼之間的重疊的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    * 

(代碼搞砸了一下這個輸出,但希望你的想法)

因此,在RI中需要一些代碼來迭代代碼列表和國家代碼t A)文件名相同且B)index1和index2之間的範圍有重疊(CodingLength可能不重要)的情況的數量。

  1. 我可能需要ASIGN表作爲變量如:

    從以下模糊的預感,我失去了,究竟如何使這項工作

    除了

    coding_table < - getCodingTable( )

  2. 我可能需要做的唯一變量的列表,例如:

    X = C( 「絲」, 「棉」,」編織」,‘縫紉’,‘午餐’......等)

  3. 我需要做的檢查

  4. 的功能,我需要一個for循環的行
  5. 我需要一個布爾測試範圍和文件名被檢查,例如所有(409:在%727 939%:939)& &名==名

在此基礎上,任何人都可以看到的方式來產生一個非常短的解決方案呢?我覺得python中的等價物最多隻有10行,但考慮到R所需的額外位數,我完全喪失瞭如何做到這一點。

+0

NB如果有人可以創建標籤'RQDA',我會這樣標記。 – joep1

回答

2

您可以使用data.table包中的foverlap函數創建邊界列表,然後將其轉換爲加權鄰接矩陣。 (見here)。

使用data.table,和igraph的組合,我認爲這會得到你想要的(不能沒有數據驗證)。

首先,將您的數據框設置爲數據表併爲index1和index2設置密鑰。然後,foverlap身份條目其中索引1和索引2有任何重疊。消除自重疊後,將數據集中相應的代碼名替換爲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是完全可選的;管道使它更加整潔,避免在環境中創建更多的物體。

+0

嗨 - 這是一個很好的答案,似乎除了一個主要問題之外基本上可以工作......它不考慮不同的文件名(請參閱頂部的示例數據)。它只考慮基於index1和index2的代碼重疊...但它也需要考慮'filename'/'fid',因爲(例如)具有重疊的index1和index2值的兩個代碼名不會重疊,除非'filename'/ 'fid'也是一樣的(即這些範圍在同一個文件中重疊)...是否可以修改你的答案以考慮到這一點? – joep1

+0

爲我澄清一件事:你想爲每個文件單獨的鄰接矩陣?或者整體分別代表每個文件中的代碼? – paqmo

+0

只有一個鄰接矩陣的整個批次,但代碼名只被視爲重疊如果兩個文件名是相同的和index1/index2範圍重疊(這基本上是一個大的日記,每天的文件名/ fid,所以對於一個代碼名稱重疊,它需要在同一個字符範圍內的文本 - index1和index2 - 以及同一天)。 – joep1

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