2013-10-31 71 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