我知道我可以使用randomizr软件包中的complete_ra来随机且均等地分配给三个“武器”之一(在这种情况下,“武器”只是人的名字)
library(randomizr)
set.seed(100)
names <- complete_ra(N = 500, num_arms = 3)
#each "arm" is chosen ~167 times
#Now put the names in
library(plyr)
df <- transform(df,
names=revalue(names,c("T1"="Luis", "T2"="Conor","T3"="Dafydd")))
但是我实际上需要将500个样本分配给三个名称中随机选择的两个。所以我需要我的数据集是:
ID# Name1 Name2
1 Conor Luis
2 Conor Dafydd
3 Luis Dafydd
...
500 Conor Luis
最后,我需要将3个中的每个都选择为相等的数量。
一种解决方法是,因为有3个名称,所以也有3个组合,所以我可以简单地将Conor替换为“ Conor and Luis”,将Luis替换为“ Luis and Dafydd”,将Dafydd替换为“ Conor and Dafydd” ...但我敢肯定,还有一种更雄辩的方法可以允许其他组合使用(例如从4个名称中选择2个)。另外,我也不喜欢这种解决方法,因为当前每个名称可以连续显示8次,这意味着我们将连续8次显示准确的对。我认为,从3个名称中随机选择2个的雄辩的方法将减少“连续”出现的情况。
答案 0 :(得分:2)
从列表中选择n个元素(此处未替换)的规范方法是sample
。这是创建500个此类样本并将结果转换为data.frame
的简单方法:
set.seed(100)
names <- c("Luis", "Conor", "Dafydd")
samples <- lapply(1:500, function(x) sample(names, 2))
head(as.data.frame(matrix(unlist(samples), ncol = 2, byrow = TRUE)))
#> V1 V2
#> 1 Luis Dafydd
#> 2 Conor Luis
#> 3 Conor Luis
#> 4 Dafydd Luis
#> 5 Conor Luis
#> 6 Conor Dafydd
由reprex package(v0.2.1)于2019-03-15创建
答案 1 :(得分:1)
使用randomizr
和tidyverse
这是一种有趣的方法。它将每个人视为两个观察值的一个块,然后使用pivot_wider
重塑数据
library(tidyverse)
library(randomizr)
tibble(
person_id = rep(1:500, each = 2),
name = rep(c("Name1", "Name2"), 500),
assignment = block_ra(
blocks = person_id,
conditions = c("Luis", "Conor", "Dafydd")
)
) %>%
pivot_wider(names_from = name,
values_from = assignment)
#> # A tibble: 500 x 3
#> person_id Name1 Name2
#> <int> <fct> <fct>
#> 1 1 Luis Dafydd
#> 2 2 Conor Luis
#> 3 3 Dafydd Luis
#> 4 4 Dafydd Conor
#> 5 5 Conor Dafydd
#> 6 6 Luis Dafydd
#> 7 7 Dafydd Luis
#> 8 8 Conor Luis
#> 9 9 Conor Luis
#> 10 10 Dafydd Conor
#> # … with 490 more rows
由reprex package(v0.3.0)于2020-01-24创建