Я пытаюсь создать поддельный набор данных для тестирования.
Было достаточно легко сгенерировать столбцы, которые существуют во всех комбинациях:
subject <- 1:5
visit <- c("D0", "D100", "D500")
isotype <- c("IgG", "IgA", "IgM", "IgD)
testdata <- expand.grid(subject, visit, isotype)
names(testdata) <- c("subject", "visit", "isotype")
Теперь мне нужно создать еще дваколонны;«положительность» с определенным значением для каждой группы в «посещении» и «ответ» со случайным целым числом с диапазоном, зависящим от каждой группы в «посещении».
Для «положительности» я мог бы сделать этотаким образом:
testdata[testdata$visit == "D0", c("positivity")] <- NA
testdata[testdata$visit == "D100", c("positivity")] <- 1
testdata[testdata$visit == "D500", c("positivity")] <- 0
и для «ответа» я мог бы сделать это так:
testdata[testdata$visit == "D0", c("response")] <- sample(1:100, 1)
testdata[testdata$visit == "D100", c("response")] <- sample(20000:30000, 1)
testdata[testdata$visit == "D500", c("response")] <- sample(1:100, 1)
, но на самом деле у меня есть гораздо больше уникальных наблюдений в «посещении», чем это иэто заняло бы вечность.Я надеялся, что смогу использовать dplyr и group_by для обхода каждой группы и назначить «позитивность» из вектора, поскольку длина этого вектора должна быть равна числу групп в «посещении», и назначить «ответ» с вектором диапазоновдля образца метода.
positivityvalues <- c(NA, 1, 0)
responseranges <- c(1:100, 1:500, 1:100)
testdata <- testdata %>%
group_by(visit) %>%
mutate(#i can't figure out what to put here
#positivity[1] = positivityvalues[1] etc...
#response[1] = sample(responseranges[1], 1) etc...
)
чтобы получить что-то подобное (для ясности перечислены только первые два предмета и изотипы)
subject visit isotype positivity response
1 D0 IgG NA 58
1 D100 IgG 1 27093
1 D500 IgG 0 2
1 D0 IgA NA 42
1 D100 IgA 1 28921
1 D500 IgA 0 85
2 D0 IgG NA 86
2 D100 IgG 1 26039
2 D500 IgG 0 54
2 D0 IgA NA 99
2 D100 IgA 1 29021
2 D500 IgA 0 23
Спасибо
Редактировать * законченообновления
Edit2 * Решение:
ranges <- list(D0=c(1:100), D100=c(25000:32000), D500=c(1:100))
positives <- c(D0=NA, D100=1, D500=0)
testdata$positivity <- positives[testdata$visit]
testdata$responsetemp <- ranges[testdata$visit]
testdata$reponse <- lapply(testdata$responsetemp, function(x) sample(x, 1))