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