2015-09-15 110 views
0

我有一個這樣的矩陣。R - 如何使用R標準化矩陣中的值

term  SaS PaP WH 
affection 3.06 2.76 2.3 
jealous  2  1.85 2.04 
gossip  1.3 0  1.78 
wuthering 0  0  2.58 

我想這個轉換成規範化的矩陣如下

term  SaS  PaP  WH 
affection 0.789 0.832 0.524 
jealous  0.515 0.555 0.465 
gossip  0.335 0  0.405 
wuthering 0  0  0.588 

我試圖使用標準化規模和掃值。但我正在下面提到錯誤

掃描(術語,2,colSums(術語),FUN = 「/」)
錯誤colSums(計算):
'x' 的必須是在陣列至少兩個維度

規模(術語,中心= FALSE,標度= colSums(術語))
錯誤colSums(計算):
'x' 的必須是至少兩個維度的陣列

這是類類型

> class(terms) 
[1] "DocumentTermMatrix"  "simple_triplet_matrix" 

請幫助。

terms <-DocumentTermMatrix(obama.train.p,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE))) 
inspect(terms[1:2, 1:100]) 
sweep(terms, 2, colSums(as.matrix(terms)), FUN ="/") 
scale(terms, center = FALSE, scale = colSums(as.matrix(terms))) 

幸運的是,它並沒有拋出任何錯誤:

更新

按照從@small_data下面的建議,具體如下我已經改變了代碼。但它沒有對數據進行標準化。

Docs   93republican94 93son 93stopgap 93surge94 93the 93we 93where 93whi 93you a10 abandon abbottabad 
    Obama 1.txt    0  0   0   0  0 0  0  0  0 0 2.321928   0 
    Obama 10.txt    0  0   0   0  0 0  0  0  0 0 0.000000 

如果您可以看到放棄的字,甚至在規範化之前和之後的值爲2.321928。任何幫助對我來說都是有用的。

謝謝

+0

@ small_data88 - 謝謝。這沒有引發任何錯誤。但數據並未標準化。發佈了該問題的更新。再次感謝您的幫助。 – Arun

+0

@ small_data88 - 我在想這是一個數據框。然而,「術語」的類別顯示爲simple_triplet_matrix。我從來沒有聽說過。 – Arun

+0

@ small_data88 - 好吧,你認爲應該做些什麼來規範化數字嗎? – Arun

回答

1

因爲第一列的類是因素sweep功能不工作。試試這個:

data.frame(term=term$term,sweep(term[,-1], 2, colSums(term[,-1]), FUN ="/")) 


     term  SaS  PaP  WH 
1 affection 0.4811321 0.5986985 0.2643678 
2 jealous 0.3144654 0.4013015 0.2344828 
3 gossip 0.2044025 0.0000000 0.2045977 
4 wuthering 0.0000000 0.0000000 0.2965517 
+0

謝謝。但我現在正在得到一個不同的錯誤。 colSums中的錯誤(terms [, - 1]):'x'必須是至少有兩個維度的數組。對此有何想法? – Arun

+0

這應該是一個數組以應用colSums函數嗎? – Arun

+0

@Arun也許你需要使用'as.data.frame'將'term'類改爲'data.frame'。在我的答案'term <-as.data.frame(term)'之前試試它,然後運行我的答案。 colSums與類似矩陣的對象一起使用。至少有兩個維度的數組意味着它應該有像矩陣那樣的列和行。 – vck