Для каждой группы назначают разные значения из вектора - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать поддельный набор данных для тестирования.

Было достаточно легко сгенерировать столбцы, которые существуют во всех комбинациях:

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))

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вот опция, использующая tidyverse.Создайте именованный вектор с уникальными значениями «посещения» (неясно, как будут изменяться значения, когда в «посещении» будет больше уникальных элементов. Используйте это, чтобы сопоставить элементы посещения и заменить их на NA, 0, 1для согласованного вектора, затем split данных для «посещения», используйте map2 до sample из range соответствующего vector

library(tidyverse)
v1 <- setNames(c(NA, 1, 0), as.character(unique(testdata$visit)))
testdata %>% 
     mutate(positivity = v1[visit]) %>% 
     split(.$visit) %>%
     map2_df(., list(1:100, 20000:30000, 1:100), ~ 
           .x %>% 
           mutate(response = sample(.y, n())))
0 голосов
/ 05 июня 2018

Вы можете сделать это с именованным вектором ...

testdata <- expand.grid(subject=subject, visit=visit, isotype=isotype) 
                                   #this way to get column names

positivityvalues <- c(D0=NA, D100=1, D500=0) #add names

testdata$positivity <- positivityvalues[testdata$visit] #adds value by name

Вы можете сделать что-то подобное с параметрами для функции sample в столбце response.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...