2016-06-27 27 views
0

我試圖創建一個包含許多列的數據表,但無法想象一種簡潔的方法(使用dplyr或其他)。讓我們考慮這樣的數據:R - 從不同的行值創建單獨的列

URL    TERM 
google.com  dog 
yahoo.com   cat 
bing.com   hamster 
google.com  dog 
google.com  cat 
yahoo.com   cat 
bing.com   dog 
yahoo.com   cat 

,我想的是這樣結束:

URL   dog cat hamster 
google.com 2  1  0 
yahoo.com 0  3  0 
bing.com  1  0  1 

這東西,我可以實現使用for環......但我還不如不使用[R基本上,我想按URL分組,爲每個唯一的TERM值創建一個新列,其中每列包含對於每個URL的所述TERM的計數。

任何想法?

+1

'as.data.frame.matrix(表(DF))' – ytk

回答

2

這可以被看作是將數據幀從長變成寬的問題,這可以通過各種方式在R中實現。更多信息請查閱link

你的情況,這可怎麼辦:

library(reshape2) 
dcast(df, URL ~ TERM) 
1

實際上有兩種操作這裏發生了:(1)聚集在兩個URLTERM產生每個這樣的複合鍵的數量,和(2)從長到寬的格式重塑。

在純基礎R,您可以使用aggregate()reshape()的組合來做到這一點:

reshape(aggregate(num~.,cbind(df,num=1L),sum),dir='w',idvar='URL',timevar='TERM'); 
##   URL num.cat num.dog num.hamster 
## 1 google.com  1  2   NA 
## 2 yahoo.com  3  NA   NA 
## 3 bing.com  NA  1   1 
-1

一個非常簡單的工作代碼。這可能不是最好的,但它會給出結果。我會很感激它的一些改進。請看以下的輸出:

 bevs <- data.frame(cbind(col1=c("google.com", "yahoo.com","bing.com","google.com","google.com","yahoo.com","bing.com","yahoo.com") ,col2= c("dog", "cat", "hamster", "dog","cat","cat","dog","cat"))) 
    bevs 
    library(plyr) 

    tab<-count(bevs, c("col1", "col2")) 
    r=matrix(NA,length(levels(tab$col1)),length(levels(tab$col2))) 
    rownames(r)=levels(tab$col1) 
    colnames(r)=levels(tab$col2) 

    for(i in levels(tab$col1)) 
    { 
     for(j in levels(tab$col2)) 
     { 

       if(length(tab$freq[tab$col1==i&tab$col2==j])==0) 
       r[i,j]=0 
       else 
       r[i,j]=tab$freq[tab$col1==i&tab$col2==j] 
     } 

    } 

    r 

輸出:

  cat dog hamster 
bing.com  0 1  1 
google.com 1 2  0 
yahoo.com 3 0  0 

在這裏找到代碼http://www.r-fiddle.org/#/fiddle?id=BveQws3p&version=10

+1

能有人請解釋我的答案有什麼問題。評論會有幫助。感謝 –

+0

有些人可能不喜歡你的代碼的不簡潔(比較它在這裏和在投票結束的鏈接中的一些其他答案)。 –

+0

謝謝您的反饋。我同意它不簡明。我應該刪除它嗎? –