[問題] 根據不同group的size取樣後再平均

作者: AmigoSafin   2019-07-03 10:08:31
[問題類型]:
請把以下不需要的部份刪除
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
請把以下不需要的部份刪除
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
請簡略描述你所要做的事情,或是這個程式的目的
大家好
我想問問大家如果遇到這樣的內容
會怎麼用R寫?
我在網路上查到aggregate可以針對不同的groups
算出組平均
例如
group
X1 A obs1 obs2
X2 B obs1 obs2
用 aggregate就可以把A和B的分組平均算出
我也想用這方法 但我需要的要再多一個步驟
我現在有6248個觀測值
他們來自175個不同的LotID
每個LotID的樣本個數(就是觀測值個數)在20,32,50和80之間
我要根據不同的樣本數隨機抽樣15,20,25,和35
我的做法是
先用table查看每個LotID有多少觀測值
然後建立一個欄位叫做Osize 就可以告訴我每個對應的LotID的本來的size
然後再建立一個新欄位NSize 根據Osize放入我預計要抽樣的數目
然後建立index=sample(Osize, Nsize, replace=FALSE)
這會是每一個LotID我要取的index value
現在就是我要怎麼把個別的LotID分離出來(不一定要放到不同的欄位 但要分開取平均)
我目前的做法是用loop
for (i in 1:nrow(Data)) 這讓我從row1跑到最後一個6248 row
(if indentical(Data$LotID[i],Data$LotID[i-1])==TRUE) ##這就告訴我第i row
會開始新的LotID
但我困難點在於如何把i這row之前的那i-1得到數值並根據其數量來取樣呢?
所以我就設定
for(j in 1:175) 因為總共有175個LotID
假設Observation這個欄位是我要的觀察值
A <- as.vector(Data$Observation)
A <- as.numeric(A) ##我把觀測值全部抓出來變成一個數列似乎對我個人比較好懂
Data$mean <- mean(Data$Observation[i:i+j*Osize[i]])
因為如果以i為21列來看
如果前面i-1是20個數值 且都屬於同一個LotID
那我就是要從這20個值當中 取出15個(因為Osize=20 Nsize=15)
但我的困擾在於j是跟著LotID
i是跟著觀測值
兩者其實有關係
但我的寫法似乎沒辦法把兩者牽在一起
aggregate求組平均的算法很容易
aggregate(Data$Observation, Data$LotID,summarize, mean)
大這是這樣 以上是我憑記憶打的 不確定
所以如果可以把觀測值根據隨機取樣的樣本先分好
再用aggregate去取平均 是一種做法
但感覺直接根據要娶隨機的size去直接取平均似乎是更簡易的方式
但我目前只會寫loop
不知道大家有沒有什麼建議?
感謝大家了
[程式範例]:
[環境敘述]:
請提供 sessionInfo() 的輸出結果,
裡面含有所有你使用的作業系統、R 的版本和套件版本資訊,
讓版友更容易找出錯誤
[關鍵字]:
選擇性,也許未來有用
作者: andrew43 (討厭有好心推文後刪文者)   2019-07-03 13:38:00
其實aggregate()是可以自定義function的。http://www.ideone.com/kJ2B0d若想要連抽出項目的id都要知道,需要再改寫。
作者: AmigoSafin   2019-07-06 23:02:00
謝謝A大~我用aggregate解決了 感恩!!這是A大您寫的嗎?太感激了!!厲害!
作者: andrew43 (討厭有好心推文後刪文者)   2019-07-06 23:18:00
這東西叫匿名函數,很實用。google: R+匿名函數

Links booklink

Contact Us: admin [ a t ] ucptt.com