我对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
,我将返回。
我在输出中得到了一些数字:19
和16
。如果我尝试调试它,我得到以下答案:
[1] vi4govpcqjnf6imquadf9ae4f0
20 Levels: 2l59mm6jc8pae32vilsr99ljp0 40iml67hpjsr8o1oo7f4oin706 ... vvqp3im2g3r90ibv56817asfq7
[1] 19
[1] nb9b1vh6ocaqsmgp8dv1s22f61
20 Levels: 2l59mm6jc8pae32vilsr99ljp0 40iml67hpjsr8o1oo7f4oin706 ... vvqp3im2g3r90ibv56817asfq7
[1] 19 16
[1] 19 16
我做错了什么?
答案 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"