2017-06-01 39 views
0

下一個字符我有識別的一些網絡路徑變量列表:獲取的R

> List_path<-list(c("A", "B", "C"), c("B", "C", "D")) 
> List_path 
[[1]] 
[1] "A" "B" "C" 

[[2]] 
[1] "B" "C" "D" 

而且還鄰接矩陣:

> MM<-matrix(c(1,1,0,0,0,-1,1,1,-1,0,0,-1,1,-1,0,0,-1,0,1,1,0,0,0,-1,1), 5, byrow=T) 
> colnames(MM)<-c("A", "B", "C", "D", "E") 
> row.names(MM)=colnames(MM) 
> MM 
    A B C D E 
A 1 1 0 0 0 
B -1 1 1 -1 0 
C 0 -1 1 -1 0 
D 0 -1 0 1 1 
E 0 0 0 -1 1 

我想確定的每個路徑的符號網絡通過使用路徑列表和矩陣。我的想法是創造一個條件,如果給定的後(確切的變量)給定j,那麼他們將形成一對[i,j],我可以用它來獲得來自我的矩陣的信息。

這裏如下或多或少我在代碼的想法:

if(List_path[[1]][j] *follows* List_path[[1]][i]){ 
    List_report[[1]]=List_report[[1]]*MM[i,j]} 

在這種情況下,List_report會已經與1's每個元素。

List_report應該是這樣的:

> List_report 
[[1]] 
[1] 1 # 1 (from original)* 1 (from [A,B]) * 1 (from [B,C]) 

[[2]] 
[1] -1 # 1 (original) * 1 (from[B,C]) * -1 (from[C,D]) 

我的問題是,有沒有爲r的函數來獲取一個我指示,或者一個正確的前後變吧?

我試圖尋找這一點,只能找其他語言getnextchar和R.沒有類似的。如果有人可以幫助,我會很感激

+0

我不明白...爲什麼你不能簡單地之前或之後使用索引:例如'I-1,I + 1'? – digEmAll

+0

也許這就是你想要的? 'lapply(List_path,函數(ⅴ)不公開(unname(地圖中(f =函數(X,Y)setNames(MM [X,Y],paste0(X, ' - >',y)的),頭部(V, - 1),尾部(v,-1)))))' – digEmAll

+0

我試圖'List_path [[1]] [j] == List_path [[1]]第[i + 1]',但只會給出一個錯誤消息說'缺少T/F所需的價值'。在'lapply'的想法,我將如何形象化的結果?沒有那部分。 –

回答

1

您可以使用此代碼:

res <- lapply(List_path, 
       function(v) prod(unlist(Map(f=function(x,y)MM[x,y],head(v,-1),tail(v,-1))))) 

> res 
[[1]] 
[1] 1 

[[2]] 
[1] -1 
+1

這就是它!非常感謝@digEmAll !! –

0

你可以使自己的getnextchar功能。這裏有一個基本的只有大寫字母:

getnextchar <- function(char) { 
    LETTERS[ which(LETTERS == char) + 1L ] 
} 

然後,例如:

getnextchar("F") 
[1] "G" 

我應該解釋LETTERS是一個建在英語中所有大寫字母的矢量對象。 letters同樣是小寫字母表。

+0

我試過你的函數,通過這種方式將它應用到我的代碼中: 'if(List_path [[1]] [j] == getnextchar(List_path [[2]] [i])) {List_res [[1]] = List_res [[1]] * marcus [i,j]}' 但我得到的是一個警告信息,其中「T/F需要的缺失值」。不知道發生了什麼.... –