在R中,如何在500个名字中选择三个,并选择均衡的名字?

时间:2019-03-14 23:26:43

标签: r random database-design

我知道我可以使用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个的雄辩的方法将减少“连续”出现的情况。

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)

使用randomizrtidyverse这是一种有趣的方法。它将每个人视为两个观察值的一个块,然后使用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创建