2012-12-08 36 views
1

我有每行一個參差不齊的數據幀中的一個或多個實體的時間的發生,創建邊緣列表如下所示:從R中粗糙的數據幀(對於網絡分析)

(time1) entitya entityf entityz 
(time2) entityg entityh 
(time3) entityo entityp entityk entityL 
(time4) entityM 

欲從第二個向量(節點列表)中找到的實體子集中創建網絡分析的邊界列表。我的問題是,我不知道:

1)。如何僅將子集中的實體進行子集化。我正在考慮

datanew<- subset(dataold, dataold %in% nodelist) 

但它不起作用。 2)。如何將不整齊的數據框放入兩列邊界列表中。在上面的例子中,它會變成:

entitya entityf 
entitya entityz 
entityz entityf 
... 

不知道該怎麼做。任何幫助真的很感激!

+0

以什麼形式,那麼「粗糙的數據幀」來?它是否是R中的一個對象(如果是這樣,哪個類並且可以通過'dput'將它提供給我們?)還是僅僅是一個文本文件? – flodel

+0

它來自我導入的csv文件中的一列,然後通過strsplt進行分割並應用。所以這是一個我可以製作成矢量的列表。 –

回答

1

試試這個:

# read your data 

dat <- strsplit(readLines(textConnection("(time1) entitya entityf entityz 
(time2) entityg entityh 
(time3) entityo entityp entityk entityL 
(time4) entityM")), " ") 

# remove (time) 

dat <- lapply(dat, `[`, -1) 

# filter 

nodelist <- c("entitya", "entityf", "entityz", "entityg", "entityh", 
       "entityo", "entityp", "entityk") 

dat <- lapply(dat, intersect, nodelist) 

# create an edge matrix 

t(do.call(cbind, lapply(dat[sapply(dat, length) >= 2], combn, 2))) 

這最後一步可能是很多消化,所以這裏是一個突破:

  • sapply(dat, length)計算列表元素的長度
  • dat[... >= 2]只保留具有至少兩個項目的列表元素
  • lapply(..., combn, 2)創建所有組合:寬矩陣列表
  • do.call(cbind, ...)結合所有組合成爲一個廣泛矩陣
  • t(...)調換成高大矩陣
+0

非常感謝!這真的很有幫助,但我應該指出:我需要的組合只能是在原始矩陣中找到的組合。目前的答案似乎給了我數據中獨特元素的所有組合。任何進一步的提示? –

+0

你是什麼意思的「原始矩陣」,並且它與你所謂的「節點列表」在你的問題?你的問題的這一部分不清楚。在我的代碼中看到,我創建了一個名爲'nodelist'的對象,它是原始數據中所有實體的子集。你可以隨意使用'nodelist'來隨意設置數據子集。 – flodel