2013-10-31 99 views
1

我是很新的R和我可能會丟失一些信息,但我不能換我的頭解決此問題:遍歷列表,並追加R中

neighbors<-function(topo,usr){ 
    n = NULL 
    for (i in 1:length(topo[,1])){ 
    if (topo[i,1] == usr){ 
     n <- append(n,topo[i,2]) 
    } 
    } 
return(n) 
} 

topo具有以下結構:

2l59mm6jc8pae32vilsr99ljp0 40iml67hpjsr8o1oo7f4oin706 
3359mm6jc8pae32vilsr99ljp0 411iml67hpjsr8o1oo7f4oin706 
... 

我想這樣做的是通過第一列驅動迴路,看到從第一列與usr的比賽和第二列的內容添加到n,我回來。

會發生什麼,我在輸出中得到一些數字:1916。如果我嘗試調試它,我收到以下答案:

[1] vi4govpcqjnf6imquadf9ae4f0 
    20 Levels: 2l59mm6jc8pae32vilsr99ljp0 40iml67hpjsr8o1oo7f4oin706 ... vvqp3im2g3r90ibv56817asfq7 
    [1] 19 
    [1] nb9b1vh6ocaqsmgp8dv1s22f61 
    20 Levels: 2l59mm6jc8pae32vilsr99ljp0 40iml67hpjsr8o1oo7f4oin706 ... vvqp3im2g3r90ibv56817asfq7 
    [1] 19 16 
    [1] 19 16 

我在做什麼錯?

回答

1

這是做你想做的?我以前stringsAsFactors=FALSE,因爲在你的代碼你可能對一個字符串

topo <- data.frame(a=c('2l59mm6jc8pae32vilsr99ljp0','40iml67hpjsr8o1oo7f4oin706'), 
       b=c('3359mm6jc8pae32vilsr99ljp0','411iml67hpjsr8o1oo7f4oin706'), 
       stringsAsFactors=FALSE) 

neighbors <- function(topo, usr){ 
    n = c() 
    for (i in seq_along(usr)){ 
     if (topo[i,1] == usr[i]) 
     n[i] <- topo[i,2] 
    } 
    return(n) 
} 

<r> neighbors(topo=topo, usr='2l59mm6jc8pae32vilsr99ljp0') 
[1] "3359mm6jc8pae32vilsr99ljp0" 

<r> neighbors(topo=topo, usr=c('2l59mm6jc8pae32vilsr99ljp0','40iml67hpjsr8o1oo7f4oin706')) 
[1] "3359mm6jc8pae32vilsr99ljp0" "411iml67hpjsr8o1oo7f4oin706" 
+0

是的,這是我正在尋找,但其他答案更優雅。 – Pio

+0

同意其他更好,不知道你的設置是多麼複雜,所以試圖在你的循環框架內工作:) – sckott

+0

但其他答案省略'stringsAsFactors = FALSE',那樣它不起作用 – Pio

5

匹配的因素更好的辦法是:

n = topo[,2][topo[,1] %in% usr] 

沒有看到你的數據集,我不能肯定地說,但是我在代碼中看到了兩個潛在問題:第1列和第2列是因子。你應該將它們轉換成字符。

2)如果usr有多個元素,if(topo[i,1] == usr)將無法​​正常工作。

+0

這將返回我的函數正在返回的內容。接受的答案解決了這個問題,因爲我必須設置'stringsAsFactors = FALSE'(你告訴我可能需要將它轉換爲字符,但不是如何) – Pio