[问题] 根据不同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