2016-10-06 26 views
0

我是R的新手,並且堅持解決問題。任何人都可以指出我在那裏出了錯 我有以下數據*使用for循環創建子集(使用一列數據幀)並找到另一列的唯一值

Score TestID 
    1536  2 
    16000  18000 
    1   15 
    7   1800 
    738  256 

有25000個測試ID和每個TestID具有相關聯的得分。在這種情況下的得分範圍從0到16000。我需要繪製獨特TestIDs存在於特定範圍即

ScoreRange  # of unique TestId 
    0 - 16000    ? 
    10 - 16000    ? 
    20 - 16000    ? 
    .     . 
    .     . 

我已經寫其中我正在考慮的步長的碼的數目的曲線圖10(範圍)並找出該範圍內唯一的TestID。雖然我還沒有想出陰謀,但我正努力以上述格式獲得輸出。

final <- matrix(0, ncol = 2, nrow = length(seq(1,max(Combined$Score),   
    10))) 


    for (i in seq(1,max(df$Score), 10)) { 
    comp <- subset(Combined, Score >= i) 
    unik <- length(unique(comp$TestID)) 
    final[,c(1,2)] <- c(i,unik) 

    } 

我得到一個非常奇怪的輸出爲最終這基本上是兩個值重複。我哪裏錯了?

回答

0

編輯:您的問題是,當您將for循環的結果寫入「最終」矩陣時,您不指定將結果寫入哪個矩陣行。爲了解決這個問題,我創建了一個「counter」變量,並在for循環之前將其設置爲0,然後爲循環的每次迭代添加1。計數器指示要將結果寫入的矩陣的哪一行。試試這個:

final <- matrix(0, ncol = 2, nrow = length(seq(0,max(Combined$Score),   
    10))) 
counter<-0 
for (i in seq(0,max(df$Score), 10)) { 
    counter<-counter+1 
    comp <- subset(df, Score >= i) 
    unik <- length(unique(comp$TestID)) 
    final[counter,c(1,2)] <- c(i,unik) 

} 
+0

假設得分按升序排列:0-16000 我多少獨特TestIDs會發現在評分範圍0-10,0-20, ........ 0-16000。如果您需要更多信息,請告知我。 – jaycee4u

+0

我對範圍還是有點不清楚,你是否想要每個範圍都以16000結尾,並且每次增加10?無論如何,我認爲這應該只是修改「seq()」聲明的問題,其餘代碼應該可以工作。讓我知道它是否有任何意義。 –

+0

理想情況下,我會希望步長爲1,但我正在從1到100進行試驗。我知道這將是一個單調遞減的函數,但是想繪製一張圖來看到相同的結果。 – jaycee4u

0

你可能考慮的另一種解決方案是生成一個直方圖hist()。使用breaks參數可以爲您提到的步長提供靈活性。無論如何,我創建的Combined迷你版爲例:

Combined <- data.frame(Score = sample(0:16000,15), 
         TestID = sample(0:25000,15)) 
> Combined 
    Score TestID 
1 11456 14802 
2 15854 1575 
3 13738 22466 
4 1659 14022 
5 10671 4213 
    ... ... 

Combined.hist <- hist(Combined$Score, 
         breaks = seq(0,16000)) 
final <- data.frame(Score = Combined.hist$breaks, 
        Counts = c(length(Combined[Combined$Score == 0]$Score), 
           Combined.hist$counts)) 
相關問題