Обновление значений в столбце на основе критериев - PullRequest
1 голос
/ 27 июня 2019

Мне нужно обновить x_elitable до 1, для всех соответствующих записей того же самого study_id & site, где x == 1. Это для того, чтобы перезаписывать значения x для тех же записей, что и study_id & site, когда x_elitable имеет значение 1

Вот воспроизводимый код:

library(tidyverse)
newdata = data.frame(site = c('A','A','A','B','B','B','B'),
                     study_id = c(1,1,2,1,1,1,2),
                     x = c(0,1,0,0,NA,1,0),
                     x_eligible = c(0,1,0,0,0,1,0))

xEligibility2 <- function (x, siteid, studyID){

  el = newdata %>% filter(site == siteid & study_id ==studyID & x_eligible==1)

  if(exists("el"))
    return(ifelse(nrow(el)>=1,1,0))
  else
    return(0)
}

newdata = newdata %>% mutate(
  x_eligible = ifelse(apply(newdata, 1, xEligibility2, siteid=site, studyID=study_id) == 1, 1, 0) 
)

И вот что я получаю в качестве результата в столбце x_elptable:

x_eligible = c(1,1,1,1,1,1,1)

x_elitable все устанавливается на 1.

Это мой ожидаемый результат:

x_eligible = c(1,1,0,1,1,1,0)

Буду признателен за любую помощь, чтобы указать, что я могу делать неправильно.

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете сгруппировать по сайту и study_id и проверить, если любое из значений в x равно 1:

library(dplyr)

newdata %>%
  group_by(site, study_id) %>%
  mutate(x_eligible = +any(x == 1))

# A tibble: 7 x 4
# Groups:   site, study_id [4]
  site  study_id     x x_eligible
  <fct>    <dbl> <dbl>      <int>
1 A            1     0          1
2 A            1     1          1
3 A            2     0          0
4 B            1     0          1
5 B            1    NA          1
6 B            1     1          1
7 B            2     0          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...