作者AmigoSafin ()
看板R_Language
标题[问题] 根据不同group的size取样後再平均
时间Wed Jul 3 10:08:31 2019
[问题类型]:
请把以下不需要的部份删除
程式谘询(我想用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 的版本和套件版本资讯,
让版友更容易找出错误
[关键字]:
选择性,也许未来有用
--
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 68.180.87.229 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1562119714.A.431.html
1F:→ andrew43: 其实aggregate()是可以自定义function的。 07/03 13:38
3F:→ andrew43: 若想要连抽出项目的id都要知道,需要再改写。 07/03 14:31
4F:→ AmigoSafin: 谢谢A大~我用aggregate解决了 感恩!! 07/06 23:02
5F:→ AmigoSafin: 这是A大您写的吗?太感激了!!厉害! 07/06 23:05
6F:→ andrew43: 这东西叫匿名函数,很实用。google: R+匿名函数 07/06 23:18