2015-10-05 88 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