【问题标题】:How to remove unused rows and columns in a matrix如何删除矩阵中未使用的行和列
【发布时间】:2017-06-16 15:21:45
【问题描述】:

我是 R 编程新手。

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

用户: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  

【问题讨论】:

  • 你能给出你的两个列表中的reproducible example 吗?如果将这两个列表绑定到一个数据框中,那么一个简单的聚合 (aggregate(pages ~ user, df, toString)) 应该可以完成这项工作
  • 所有用户访问的页面数量都相同吗?如果没有,矩阵将不起作用,因为您需要为每个用户提供不同数量的列。
  • @herbaman 每个用户浏览的页面数不同。现在我明白我的错误是不能使用矩阵,因为它应该是一些固定的行 x 列。您能否提出任何替代方法来实现我的预期解决方案?
  • 我一直在研究这个解决方案,但我同意@herbaman,矩阵的列数是固定的,它会影响最终输出。您正在打印 NA ,因为您的矩阵单元格已初始化为没有值。提供最终解决方案的可能方法是:a)用空字符串初始化矩阵或在 out 函数中设置 na.print 标志以将 NA 值可视化为例如。空字符串,或 c) a) 或 b) 的组合,并将矩阵行修剪为单个用户查看的最大页面数
  • 您可以使用列表列表,@Sotos 提到的aggregate(),deplyr 的group_by(),或data.table()。我支持@Sotos,您应该提供一个可重现的数据示例。

标签: r matrix


【解决方案1】:

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"

【讨论】:

    【解决方案2】:

    这样就可以了:

     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 = '')
    

    希望此解决方案有所帮助。

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-08
      • 2021-05-17
      • 2012-10-14
      • 2016-05-26
      • 2020-01-25
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多