用于循环的R错误结果

时间:2014-03-30 23:48:32

标签: r loops for-loop

我有以下代码

n=c('a','b','c')
one=c('a','c')
two=c('b','a')
three=data.frame(one, two)
m=matrix(0,3,2)
for (i in length(n) ) {
   m[i,]=t(1*(n[i]==three[,1])-1*(n[i]==three[,2]))
}

t(1*(n[1]==three[,1])-1*(n[1]==three[,2]))
t(1*(n[2]==three[,1])-1*(n[2]==three[,2]))
t(1*(n[3]==three[,1])-1*(n[3]==three[,2]))

为什么m矩阵的输出和最后3行的输出不同?有没有有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

因为你想要

for (i in seq_along(n)) {

答案 1 :(得分:1)

因为您问过使用apply函数是否有更好的方法可以执行此操作,所以请转到此处。 do.call(rbind, ...)的结果“自然地”强制转换为矩阵,因此无需事先定义矩阵m

我不理解乘以1背后的逻辑,所以我把它排除了。如果你需要,它仍然可以使用。

> n <- c('a','b','c')
> three <- data.frame(one = c("a", "c"), two = c("b", "a"))
> m <- do.call(rbind, lapply(seq(n), function(i){
+     t((n[i] == three[,1]) - (n[i] == three[,2]))
+ }))
> m
     [,1] [,2]
[1,]    1   -1
[2,]   -1    0
[3,]    0    1