Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何删除矩阵中未使用的行和列_R_Matrix - Fatal编程技术网

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

R 如何删除矩阵中未使用的行和列,r,matrix,R,Matrix,我不熟悉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,

我不熟悉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     
page2 page4 page1  

这将实现以下目的:

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

k这将实现以下目的:

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

k将
记录作为输入,然后

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

记录作为输入,然后

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

你能把你的两张单子给我举个例子吗?如果您将两个列表绑定到一个数据框中,那么一个简单的聚合(
aggregate(pages~user,df,toString)
)应该执行此任务。所有用户访问相同数量的页面吗?否则,矩阵将无法工作,因为每个用户需要不同的列数。@herbaman每个用户查看的页面数是不同的。现在我明白了我的错误,矩阵不能被使用,因为它应该是一些固定的行x列。你能建议其他方法来实现我的预期解决方案吗?我一直在研究这个解决方案,但我同意@herbaman的观点,矩阵有固定的列数,它会影响最终的输出。您正在打印NA,因为矩阵的单元格初始化时没有值。提供最终解决方案的可能方法是:a)使用空字符串初始化矩阵,或在out函数中设置na.print标志,以将na值可视化为空字符串,或c)a)或b)的组合,并将矩阵行修剪为单个用户查看的最大页数您可以使用列表列表,
aggregate()。我支持@Sotos,你应该提供一个可复制的数据示例。你能给出两个列表的一个例子吗?如果您将两个列表绑定到一个数据框中,那么一个简单的聚合(
aggregate(pages~user,df,toString)
)应该执行此任务。所有用户访问相同数量的页面吗?否则,矩阵将无法工作,因为每个用户需要不同的列数。@herbaman每个用户查看的页面数是不同的。现在我明白了我的错误,矩阵不能被使用,因为它应该是一些固定的行x列。你能建议其他方法来实现我的预期解决方案吗?我一直在研究这个解决方案,但我同意@herbaman的观点,矩阵有固定的列数,它会影响最终的输出。您正在打印NA,因为矩阵的单元格初始化时没有值。提供最终解决方案的可能方法是:a)使用空字符串初始化矩阵,或在out函数中设置na.print标志,以将na值可视化为空字符串,或c)a)或b)的组合,并将矩阵行修剪为单个用户查看的最大页数您可以使用列表列表,
aggregate()。我支持@Sotos,您应该提供一个可复制的数据示例。
matrix(paste0('page', m1[,-1]), nrow = nrow(m1))
#     [,1]    [,2]    [,3]   
#[1,] "page1" "page3" "page4"
#[2,] "page2" "page4" "page1"