如何删除矩阵中未使用的行和列

时间:2017-06-16 15:21:46

标签: r matrix

我是R Programming的新手。

我有两个列表,一个列表包含用户名。 另一个列表包含每个用户访问的页面

用户:AAA BBB CCC DDD

记录:

page 1  AAA  
page 2  BBB  
page 3  AAA  
page 4  BBB   
page 1  BBB    
page 4  AAA  

我需要收集每个用户访问的所有页面

需要输出:

Pages visited by AAA page1,page 3, page 4  
Pages visited by BBB page 2, page4, page 1   

我试图将每个用户访问的页面存储在矩阵中 例如,矩阵的第1行中的列将包含用户1查看的页面,依此类推 请看下面的代码:

k <- 0
    out <- matrix(NA, nrow=100, ncol=50) #my final output matrix
    for (i in users) 
    {
    k <- k+1
    p <- 0
    for (j in records) 
    {
     x<-(strsplit(j, "\t"))
    if(x[[1]][2]== i) #gather all pages visited by a same user
    {
    p <- p+1    
    out[k,p]=c(x[[1]][1])
    }
    }
    x <- 0
    #here i need to remove unused columns in row k
    }
out <- out[1:(k),]  #remove unused rows in a matrix
print (out)

我得到的输出

page1 page3 page4 NA NA NA .... NA   
page2 page4 page1 NA NA NA .... NA

需要最终矩阵:

page1 page3 page4     
page2 page4 page1  

2 个答案:

答案 0 :(得分:0)

这样可以解决问题:

 k <- 0
 out <- matrix(NA, nrow=100, ncol=50) #my final output matrix

 #Initialize max count of rows
 maxr<-0

 for (i in users) 
 {
   k <- k+1
   p <- 0


   for (j in records) 
   {
     x<-(strsplit(j, "\t"))
     if(x[[1]][2] == i) #gather all pages visited by a same user
     {
       p <- p+1    
       out[k,p] =c(x[[1]][1])

       #If we have a greater p, p will be the new maxr
       if(p > maxr)
       {
         maxr <- p
       }
     }
   }
   x <- 0
   #here i need to remove unused columns in row k
 }

 #Trim matrix by rows and cols
 out <- out[1:(k),1:(maxr)]  #remove unused rows in a matrix

 #Replace NA with empty string
 print (out, na.print = '')

希望这个解决方案有所帮助。

此致

答案 1 :(得分:0)

records作为输入,然后

df <- as.data.frame(do.call(rbind, strsplit(gsub('\t', ' ', records), ' ')), 
                                                     stringsAsFactors = FALSE)

aggregate(V2 ~ V3, df, toString)
#   V3      V2
#1 AAA 1, 3, 4
#2 BBB 2, 4, 1

如果你想要一个矩阵,那么,

m1 <- aggregate(V2 ~ V3, df, matrix)

m1[,-1]
#     [,1] [,2] [,3]
#[1,] "1"  "3"  "4" 
#[2,] "2"  "4"  "1" 

或者如果你真的想在数字前加上'page',

matrix(paste0('page', m1[,-1]), nrow = nrow(m1))
#     [,1]    [,2]    [,3]   
#[1,] "page1" "page3" "page4"
#[2,] "page2" "page4" "page1"