我有以下代码
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行的输出不同?有没有有效的方法来做到这一点?
答案 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