检索大矩阵中的数据条目以在R

时间:2015-11-17 19:09:56

标签: r matrix

我有一个mXn矩阵,其中m = 1000且n = 1000.需要根据矩阵中的每个数据条目执行复杂的求和。

对于Ex:在矩阵中,' m'代表用户'和' n'表示'项目'。仅当存在与同一项目的多个用户相对应的数据条目时才会执行求和。

     i1 i2 .......
---|---|--|---------------
u1 |1  |NA|
u2 |2  |2 |
u3 |NA |NA|
.
.
. 

在上面的矩阵中,

u1,u2,u3 ----矩阵的行 i1,i2,i3 ----矩阵的列

这里,u1和u2有i1的数据输入 - 现在我需要检索值来执行求和操作。

我认为如果我使用两个 for 循环来比较一个用户与另一个用户对于那个大小的矩阵中的每个项目列,效率会不高。

请建议我在R中执行上述操作的有效方法。

下面是我需要执行的伪代码,

for(i=1 to length(column)){
  for(j=1; user1 -> row1){
    for(k=1; user2 -> row2){
       if(multiple_data_entries_exist_for_column){
         retrieve_data_entry_of_each_row
       else{
           go_to_next_column
           }
       }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我假设你想知道你的代码可以被矢量化的方式。在R中,这是一种非常有效的方法。

user_matrix <- data.frame(
  id = 1:3,
  i1 = c(1,2,NA),
  i2 = c(NA,2,NA) 
)
user_matrix
#   id i1 i2
# 1  1  1 NA
# 2  2  2  2
# 3  3 NA NA

tail(sapply(user_matrix, function(x) sum(x[!is.na(x)])),-1)
# i1 i2 
# 3  2 

如果您想说明第2列只有一个条目,并且您不想对此列求和,则可以执行以下操作。

tail(sapply(user_matrix, 
  function(x) {
    y = !is.na(x)
    ifelse(sum(y)>1,sum(x[!is.na(x)]),NA)
}),-1)
# i1 i2 
 # 3 NA