2016-04-13 19 views
0

私はI obsevationsのデータフレームを持ち、各観測値はgカテゴリのいずれかに属します。グループ(ブロック)別に観測値をランダム化

set.seed(9782) 
I <- 500 
g <- 10 
library(dplyr) 

anon_id <- function(n = 1, lenght = 12) { 
    randomString <- c(1:n) 
    for (i in 1:n) 
    { 
    randomString[i] <- paste(sample(c(0:9, letters, LETTERS), 
            lenght, replace = TRUE), 
          collapse = "") 
    } 
    return(randomString) 
} 

df <- data.frame(id = anon_id(n = I, lenght = 16), 
       group = sample(1:g, I, T)) 

私はランダム確率pのいくつかのベクトル与えJ「壷」の1つに各観測を割り当てます。それは壷J = 1に割り当てられる確率はp [1]です。追加された複雑さは、私がブロックごとにこのブロックを実行したいということです。

私はブロックを無視した場合、私は簡単にこれを行うことができます。

J <- 3 
p <- c(0.25, 0.5, 0.25) 
df1 <- df %>% mutate(urn = sample(x = c(1:J), size = I, replace = T, prob = p)) 

は、私が「ブロック」でそれを行うには、この方法について考え

# Block randomization 
randomize_block <- function(g) { 
    df1 <- df %>% filter(group==g) 
    size <- nrow(df1) 
    df1 <- df1 %>% mutate(urn = sample(x = c(1:J), 
            size = size, 
            replace = T, 
            prob = p)) 
    return(df1) 

} 

df2 <- lapply(1:g, randomize_block) 
df2 <- data.table::rbindlist(df2) 

は、より良い方法はありますか?

+2

はグループによってあなただけのグループあなたが変異する前にできますか? – bramtayl

+0

@bramtayl私はそれについて考えましたが、私はどのように 'size'をそのサンプル関数に渡すのか分かりません。各グループは異なる観測数を持つことができます。 – Ignacio

+1

サイズにn()を使用してください – bramtayl

答えて

2

これは良いですが、ここでは長さのベクトルp J.

に割り当て確率で「グループ」のグループ名だけでなく、骨壷の割り当て 1:Jを持ってdata.frame DFとベースRの技術であるかどうかわかりません
# get urn assignment 
urnAssignment <- lapply(unique(df$group), 
        function(i) sample(1:J, nrow(df[group==i,]), replace =T, prob=p)) 

# get a list that collects position of observations 
obsOrder <- lapply(unique(df$group), 
        function(i) which(df$group == i)) 

df$urnAssignment <- unlist(urnAssignment)[unlist(obsOrder)] 
0

これはdplyrを使用してトリックを行います。

randomize <- function(data, groups=2, block_id = NULL, p=NULL, seed=9782) { 
    if(is.null(p)) p <- rep(1/groups, groups) 
    if(is.null(block_id)){ 
    df1 <- data %>% 
     mutate(Treatment = sample(x = c(1:groups), 
           size = n(), 
           replace = T, 
           prob = p)) 
    return(df1) 
    }else{ 
    df1 <- data %>% group_by_(block_id) %>% 
     mutate(Treatment = sample(x = c(1:groups), 
           size = n(), 
           replace = T, 
           prob = p)) 
    } 
}  

df1 <- randomize(data = df, groups = J, block_id = "group", p = p, seed = 9782) 
関連する問題