Условное изменение с помощью if else списка символьных векторов% в% вектора переменных. Включая данные испытаний - PullRequest
0 голосов
/ 12 марта 2020

Я сортирую фрейм данных, в котором есть много разных диагностик, т.е. переменных v1, v2, v3. Диагностические тесты c могут давать категорические результаты, такие как «Sick», «Sick2» или «nosick». Пациенты проходили эту диагностику несколько лет подряд - «год».

Я хочу создать новую переменную, «Eval», которая бы классифицировала пациентов как больных (1), если какой-либо один или более из диагностируемых c переменных включают положительный ответ, то есть «больной» или «больной2», в противном случае пациент не болеет (0)

testframe %>% group_by(year) %>% mutate(Eval=ifelse(any(sickvars %in% sickv)==TRUE,1,0))

Тем не менее, вышеуказанный вызов также оценивает годы в котором нет положительных ответов как 1.

У меня тоже не было успеха с:

testframe %>% group_by(year) %>% mutate(if(any(sickvars %in% sickv)==TRUE){Eval <- 1} else {Eval <- 0})

Вот тестовый фрейм для использования.

#Create testframe
v1 <- c("Sick","nosick","nosick","nosick","nosick")
v2 <- c("nosick","nosick","Sick2","nosick","nosick")
v3 <- c("nosick","Sick","Sick","nosick","nosick")

sickv <- c("Sick","Sick2")
sickvars <- c(v1,v2,v3)
year <- c(1,2,3,4,5)
testframe <- data.frame(sickid,v1,v2,v3)

1 Ответ

2 голосов
/ 12 марта 2020

Мы можем использовать pmap, чтобы выяснить, содержит ли любое значение в столбце sickvars any из sickv.

library(dplyr)
testframe %>%
   mutate(Eval = purrr::pmap_int(select(., sickvars), ~any(c(...) %in% sickv)))

#  year     v1     v2     v3 Eval
#1    1   Sick nosick nosick    1
#2    2 nosick nosick   Sick    1
#3    3 nosick  Sick2   Sick    1
#4    4 nosick nosick nosick    0
#5    5 nosick nosick nosick    0

В базе R мы можем использовать lapply с Reduce

testframe$eval <- +(Reduce(`|`, lapply(testframe[sickvars], `%in%`, sickv)))

данные

v1 <- c("Sick","nosick","nosick","nosick","nosick")
v2 <- c("nosick","nosick","Sick2","nosick","nosick")
v3 <- c("nosick","Sick","Sick","nosick","nosick")
sickv <- c("Sick","Sick2")
sickvars <- c("v1","v2","v3")
year <- c(1,2,3,4,5)
testframe <- data.frame(year,v1,v2,v3, stringsAsFactors = FALSE)
...