楼主: loicki
17049 11

新手请教随机抽样的R实现 [推广有奖]

  • 2关注
  • 1粉丝

本科生

78%

还不是VIP/贵宾

-

威望
0
论坛币
3731 个
通用积分
0
学术水平
3 点
热心指数
2 点
信用等级
2 点
经验
261 点
帖子
23
精华
0
在线时间
188 小时
注册时间
2007-4-14
最后登录
2021-7-31
毕业学校
Orebro University

楼主
loicki 发表于 2011-1-28 03:09:46 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
比如我有以下数据:
X   Y
3   5
6   8
4   2
7   9
1   0
我想随机抽3对(x,y)出来,抽10次,请问怎么用R实现?谢谢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:随机抽样 R实现 请教 新手 随机

沙发
jerry0501 发表于 2011-1-28 03:27:26
sim<-10000
xy<-matrix(c(3,6,4,7,1,5,8,2,9,0),5,2)
sample<-matrix(data=NA,nrow=sim,ncol=2)
index<-floor(runif(sim, min=1, max=5.9999999))
for (i in 1:sim){sample[i,1]<-xy[index[i],1]; sample[i,2]<-xy[index[i],2]}

藤椅
ltx5151 发表于 2011-1-28 04:58:46
假设你的XY 如上表所示排成一个矩阵XY
SampXY<-XY[sample(nrow(XY),3),]

板凳
loicki 发表于 2011-1-30 00:23:04
ltx5151 发表于 2011-1-28 04:58
假设你的XY 如上表所示排成一个矩阵XY
SampXY<-XY[sample(nrow(XY),3),]
谢谢ls的,但我不只是抽一次3对出来,而是抽10次,该怎么弄呢

报纸
ltx5151 发表于 2011-1-30 01:38:10
4# loicki
你循环一下就好了呀

地板
loicki 发表于 2011-1-30 04:07:38
5# ltx5151

谢谢楼上,我终于解决了,代码可以是:
x<-c(3,6,4,7,1)
y<-c(5,8,2,9,0)
xy<-cbind(x,y)
xy_sample<-function(xy){
mysample<-xy[sample(1:5,3),]
mysample
}
res<-list()
length(res)<-10
for (i in 1:10){
res[]=xy_sample(xy)
}
res

但又有一个后续问题,我又编了一段代码:
f<-function(h){
   xk<-res[[h]][,1]
   yk<-res[[h]][,2]
   a<-sum(xk*yk)
   return(a)
   }
然后f(1),f(2)输出都是对的,但是如果我想输出f(1:10),就出现错误 Error in res[[h]] : recursive indexing failed at level 2
请问这是为什么?该如何解决呢

7
qoiqpwqr 发表于 2011-1-30 04:42:24
因为你的f函数的参数只是一个数,你不能用一个vector,比如f(1:10)
一个办法就是Vectorize
ff <- Vectorize(f, "h")
ff(1:10)

BTW: 前面你没有必要写循环,直接sample30次就好了,每三个是一组。
res <- xy[sample(1:nrow(xy), 30, replace = TRUE), ]
apply(matrix(res[, 1]*res[, 2], ncol = 3, byrow = TRUE), 1, sum)

8
shenbaiseshatan 在职认证  发表于 2011-1-30 10:30:36
如果需要不放回抽样可以使用如下代码
  1. xy<-matrix(c(3,6,4,7,1,5,8,2,9,0),5,2)
  2. l.xy<-nrow(xy)
  3. times.sample<-10
  4. set.seed(20110130)
  5. result.sample<-do.call('rbind',lapply(1:times.sample,function(x) {sample(1:l.xy,3)}))
复制代码
如果只需要有放回抽样那么参照7#的办法就可以了
胜人者有力,自胜者强!

9
loicki 发表于 2011-1-31 05:18:46
谢谢楼上两位,学习了

10
wngbaq 发表于 2011-2-7 22:04:59
程序写的真好,学习了!
心慈行孝,何需努力看经;意恶损人,空读如来一藏.

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-28 15:14