根据会话随机分配治疗虚拟变量

Randomly assign Treatment dummy variables according to session

我想分配一个名为 "sender" 的虚拟变量,但是,我只想在每个会话中随机分配,而不是在整个实验中随机分配。

假设我有 180 名学生的数据。每节课有 18 名学生。因此,我有 10 个会话。在每个会话中,应该有 9 个发送者(值为 1)和 9 个接收者(值为 0)。

到目前为止,我只做到了这一点,整个实验如下:

va <- c(1,0)
df$sender[sample(1:nrow(df1), nrow(df1), FALSE)] <- rep(va, 90,90)

我正在考虑通过为每个会话重复应用相同的代码 10 次以上来以原始方式进行操作,但数据可能会变得更大。我将不胜感激一些帮助!谢谢!

不太确定您的预期输出是什么,但这应该可以帮助您找到正确的方向:

students = 5 # per trial
trials = 3
senders = 2 # per trial

df = data.frame(studentID = seq(1,students*trials),session = 
                  rep(seq(trials), times = rep(students,trials)))

df$sender = unlist(sapply(seq(trials), function(x) 
        {as.numeric(seq(1,students) %in% sample(students,senders))}, simplify=F))

输出:

现在,我们有 3 个会话,每个会话有 5 个学生,每个试验恰好有 2 个发件人。

   studentID session sender
1          1       1      0
2          2       1      0
3          3       1      1
4          4       1      1
5          5       1      0
6          6       2      1
7          7       2      0
8          8       2      1
9          9       2      0
10        10       2      0
11        11       3      1
12        12       3      1
13        13       3      0
14        14       3      0
15        15       3      0

希望对您有所帮助!

使用 dplyr 的替代解决方案:

library(dplyr)

# create example dataset
session_id = 1:10
student_id = 1:18

df = expand.grid(student_id=student_id, session_id=session_id)

# fix randomisation (to replicate results)
set.seed(259)

df %>%
  sample_frac(1) %>%                                     # shuffle dataset (i.e. resample 100% of rows)
  group_by(session_id) %>%                               # for each session id
  mutate(sender = ifelse(row_number() <= 9 , 1, 0)) %>%  # flag as senders the first 9 (random) rows
  ungroup() %>%                                          # forget the grouping
  arrange(session_id, student_id)                        # arrange columns (not needed; only for visualisation purposes)


# # A tibble: 180 x 3
#   student_id session_id sender
#        <int>      <int>  <dbl>
# 1          1          1      0
# 2          2          1      0
# 3          3          1      1
# 4          4          1      1
# 5          5          1      0
# 6          6          1      1
# 7          7          1      0
# 8          8          1      1
# 9          9          1      0
# 10         10         1      1
# # ... with 170 more rows