2017-06-16 43 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 = '') 

希望此解決方案有所幫助。

問候,