如何用循环

时间:2015-07-30 18:50:25

标签: r loops matrix

我有一个名为Trial的空白矩阵,即5000 X 5000,但我会放一个小片段。

     a  b  c  d  e  f 
 a  

 b  

 c  

 d  

 e  

 f  

我希望用我的数据表填充矩阵。

Name Value
-----------
Cat   A 
Cat   B
Cat   E
Dog   D
Dog   C
Dog   F

所以基本上最后,我希望矩阵像这样填充:

     a  b  c  d  e  f 
 a   1  1  0  0  1  0

 b   1  1  0  0  1  0

 c   0  0  1  1  0  1

 d   0  0  1  1  0  1

 e   1  1  0  0  1  0

 f   0  0  1  1  0  1

因此,与名称相关的所有值都将为1,如果它们不相关,则它们将为0.例如,A和F不相关,因为它们是不同的名称(猫和狗),因此它们将获得0。

1 个答案:

答案 0 :(得分:1)

这是循环方式

dd <- read.table(header = TRUE, text="Name Value
Cat   A 
Cat   B
Cat   E
Dog   D
Dog   C
Dog   F")

o <- order(dd$Value)
sapply(1:nrow(dd), function(x) dd$Name %in% dd[x, 'Name'] + 0L)[o, o]
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    1    0    0    1    0
# [2,]    1    1    0    0    1    0
# [3,]    0    0    1    1    0    1
# [4,]    0    0    1    1    0    1
# [5,]    1    1    0    0    1    0
# [6,]    0    0    1    1    0    1

或使用明确的for循环

mm <- matrix(nrow = nrow(dd), ncol = nrow(dd))
for (ii in 1:nrow(mm))
  mm[ii, ] <- dd$Name %in% dd[ii, 'Name'] + 0L
mm[o, o]

对于5000 x 5000,在我的笔记本电脑上花费不到2秒

dd <- data.frame(Name = sample(LETTERS, 5000, replace = TRUE), Value = 1:5000)
o <- order(dd$Value)

system.time({
  oo <- sapply(1:nrow(dd), function(x) dd$Name %in% dd[x, 'Name'] + 0L)[o, o]
})


#  user  system elapsed 
# 1.680   0.188   1.874 

system.time({
  mm <- matrix(nrow = nrow(dd), ncol = nrow(dd))
  for (ii in 1:nrow(mm))
    mm[ii, ] <- dd$Name %in% dd[ii, 'Name'] + 0L
  mm[o, o]
})

#  user  system elapsed 
# 1.918   0.152   2.073