2015-10-05 107 views
0

我试图在R中编写一个循环,以基于原始数据集的随机采样创建200个数据帧。我希望用一个固定比例的10%男性(编码为1)和90%女性(编码为0) - 可变SEX - 以及与原始数据集相同的行数进行替换,绘制样本。R - 绘制具有固定概率的随机样本

这里是我有多远了:

for (i in 1:200) { 

smpl[i] <- data[sample(nrow(data), nrow(data), replace=T, prob=ifelse(data$SEX==1,0.1,0.9)),] 

} 

该代码遗憾的是没有工作...

首先绘制了随机抽样的男性的比例不保留对女性的代码0.1:0.9。

其次,当我尝试循环通过命令我得到的错误消息:

警告在[<-.data.frame*tmp*,I,值=列表(ID = C(32604L,11645L,: 提供41个变量来替换1个变量

谁能帮

+1

什么'cox'为什么不'nrow(数据)'?什么是'smpl'?它是一个正确分配的列表吗?你为什么不使用'smpl [[i]]'?不要说只是“它不工作”,而是指定你遇到的问题(错误?意外结果?警告?) – nicola

+0

嗨!对不起,在原始帖子中添加了缺少的信息。该代码绘制随机样本,但不在指定比例内。当我尝试循环200次以创建200个数据帧时,它不会执行它...(我原始数据集的名称是“cox” - 复制粘贴错误) – user3018739

+0

您应该在循环:'smpl <-vector(“list”,200)'和循环内部使用'smpl [[i]] < - '与双方括号。你的意思是“不保持比例”?由于采样方差,获得的样本不完全是180-20是正常的。 – nicola

回答

1

首先,一些样本数据:

## Sample data 
nMen <- 50 
nWomen <- 60 

set.seed(124) 

mydata <- data.frame(SEX = rep(c("female", "male"), times = c(nWomen, nMen)), 
    myValue = rnorm(nMen + nWomen), ID = seq_len(nMen + nWomen)) 

然后,计算出你想每个样本中男性和女性的数量 - 这必须是整数

## Number of women and men for the sampling 
nSampW <- (nWomen + nMen) * 0.9 
nSampM <- (nWomen + nMen) * 0.1 
## These should be integer (the following should be TRUE) 
nSampW %% 1 ==0 
nSampM %% 1 ==0 

然后设置你的结果向量 - 下面创建了空间名单200个样本

## Set up results list 
mySamp <- vector(mode = "list", length = 200) 

然后循环,取样按性别划分,从指标计算以上男性和女性人数

## The loop 
for(i in seq_along(mySamp)) { 
## Get indices by SEX 
    idxW <- which(mydata$SEX == "female") 
    idxM <- which(mydata$SEX == "male") 
## Sample corresponding number of rows from those indexes with replacement 
    tempW <- mydata[sample(idxW, nSampW, replace = TRUE), ] 
    tempM <- mydata[sample(idxM, nSampM, replace = TRUE), ] 
## rbind back together and assign 
    mySamp[[i]] <- rbind(tempW, tempM) 
} 

然后检查,看看比例是否正确

# sapply(mySamp[1:10], function(x) prop.table(table(x$SEX))) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# female 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 
# male 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 
+0

非常感谢,完全奏效! – user3018739

0

你的代码永远不会给你一个精确的10%-90%分割。

这个怎么样:

ans <- list() 
# sample data 
data_test <- data.frame(SEX = sample(c(0,1), 100, replace = TRUE), val = rnorm(100)) 

for(i in 1 : 200){ 

    data_m <- data_test[data_test$SEX == 1, ] 
    data_m1 <- data_m[sample(nrow(data_m), floor(nrow(data_test) * 0.1), replace = TRUE), ] 

    data_f <- data_test[data_test$SEX == 0, ] 
    data_f1 <- data_f[sample(nrow(data_f), floor(nrow(data_test) * 0.9), replace = TRUE), ] 

    new_data <- rbind(data_f1, data_m1) 
    ans[[i]] <- new_data 
} 
+0

谢谢!棒极了!我也想过类似的东西,但希望确保函数“sample”中的“prob”参数(天真地希望代码可能更容易)。 – user3018739