2017-08-02 37 views
0

假定以下數據幀:

Application <- c('A','A','B','B','B','C','C','D') 
Rating <- c('0','0.6','0.6','2.0','2.0','3.8','3.8','3.9') 

DF <- data.frame(Application,Rating) 

DF 
#Application Score 
#1   A  0 
#2   A 0.6 
#3   B 0.6 
#4   B 2.0 
#5   B 2.0 
#6   C 3.8 
#7   C 3.8 
#8   D 3.9 

我想創建一個空的結果表,以通過一個循環來填充: 第一柱 - 顯示等級被計算(例如0.6) 第二列 - 顯示DF 第三列中評級的次數 - 列出DF中評級的總數(即8) 第四列 - 計算該評級相對於整體R用於循環異常擴大範圍時

#create empty results table 
results_rating_bins <- as.data.frame(matrix(nrow = 1, ncol = 4)) 

#initiate row count 
rownr = 1 

#Loop: 

for (rating in seq(from = 0, to = 4.0, by = 0.1)) { 
this_rating <- subset(DF, DF$Score == rating) 
results_rating_bins[rownr, 1] = rating 
results_rating_bins[rownr, 2] = nrow(this_rating) 
results_rating_bins[rownr, 3] = nrow(DF) 
results_rating_bins[rownr, 4] = nrow(this_rating)/nrow(DF) 
rownr <- rownr + 1 
} 

最後的結果是我所期望的,除了等級2.0,其中計數,即使0應該是2

這說明在小規模的,我在規模較大看到30K的線數據集。我有一個評分從0到4.9的應用程序列表,因此我的循環範圍將設置爲0到4.9,而不是0.6到4.0。但是,當我在大數據集上運行循環時,最終會得到一些評級計數爲0的實例,即使它不應該是這樣。更奇怪的是,通過玩弄範圍,發生異常(即計數= 0)的評級完全隨機地變化。

任何想法可以證明這種行爲的理由?

大赦

+0

[R FAQ 7.31](https://cran.r-project.org/doc幀的總數/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f)?編輯:無視,你正在做'字符'數字比較。 – r2evans

+0

雖然不是7.31,但它仍然相關...由於您正在將一個數字(0到4.0之間的數字)與一個「字符」進行比較,因此該數字會被上轉換爲一個字符。並猜測'as.character(2.0)'轉換成什麼? (提示:不是'「2.0」'。)也許你更喜歡使用'for(格式爲(seq(...),format =「%0.1f」))''的格式。 – r2evans

回答

0

通常我回答的問題是問,試圖通過一個問題的海報已經在使用的邏輯工作。但是,在這種情況下,使用dplyr來集成到我違背傳統的新表中變得非常容易。

require(dplyr) 
    Application <- c('A','A','B','B','B','C','C','D') 
    Rating <- c('0','0.6','0.6','2.0','2.0','3.8','3.8','3.9') 
    DF <- data.frame(Application,Rating) 

    df2<-DF%>% 
     group_by(Application, Rating)%>% 
     summarize(ratio=(n()/nrow(DF))) 

第一部分是你的一樣,但與庫調用添加 它開始df2要設置等於基於應用的組合,你的初始數據幀的分組版本DF2數據幀和評級。在總結聲明中,對於每種可能的組合,我們告訴它計數n()並將其除以原始數據框中的總行數nrow(DF),這將創建新的每個對代表的總數的百分比。

它看起來像這樣,如果你需要它,你可以添加帶有另一個彙總語句的行數的列,但是執行這個功能是不必要的。

Application Rating ratio 
1   A  0 0.125 
2   A 0.6 0.125 
3   B 0.6 0.125 
4   B 2.0 0.250 
5   C 3.8 0.250 
6   D 3.9 0.125 

這將絕對捕獲應用程序和評級的每個組合,並計算相對於整個數據框的比率。

編輯:如果你不關心申請函,你可以隱含從group_by函數中刪除它,並仍然得到你想要的。

並添加
%>%
summarise(rows=nrow(DF))
如果所需的行中每一行上