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

时间:2017-12-19 09:50:06

标签: r dataframe dummy-variable

我想分配一个名为“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次以上相同的代码以原始方式进行,但数据可能会大于此。我会感激一些帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

不确定您的预期输出是什么,但这可以帮助您朝着正确的方向前进:

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

希望这有帮助!

答案 1 :(得分: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