2017-06-16 60 views
1

我是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) 

输出I获得所需

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

最终母:

page1 page3 page4  
page2 page4 page1 
+1

你可以给你的两个列表[可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)吗?如果将两个列表绑定到一个数据框中,那么一个简单的聚合('aggregate(pages〜user,df,toString)')应该执行 – Sotos

+0

这个工作吗?所有用户都访问相同数量的页面吗?如果不是,矩阵将不起作用,因为每个用户需要不同数量的列。 – herbaman

+0

@herbaman每个用户查看的页面数量不同。现在我明白我的错误,即一个矩阵不能使用,因为它应该是一些固定的行x cols。你能建议任何替代方法来实现我的预期解决方案吗? – AJOY

回答

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" 

或者如果你真的想用 '页面' 在前面的数字,

matrix(paste0('page', m1[,-1]), nrow = nrow(m1)) 
#  [,1] [,2] [,3] 
#[1,] "page1" "page3" "page4" 
#[2,] "page2" "page4" "page1" 
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 = '') 

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

问候,