循环遍历列表并附加在R中

时间:2013-10-31 16:49:00

标签: 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

我做错了什么?

2 个答案:

答案 0 :(得分:5)

更好的方法是:

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

如果没有看到您的数据集,我无法肯定地说,但我在您的代码中看到了两个潜在的问题:

1)topo第1列和第2列是因素。你应该将它们转换为角色。

2)如果usr有多个元素,if(topo[i,1] == usr)将无法按预期工作。

答案 1 :(得分: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"