Улучшение решения dplyr - создание переменной путем условного упорядочения (положения) на основе другой информации - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над набором данных, где каждый участник (ID) оценивался 1, 2 или 3 раза.Это продольное исследование.К сожалению, когда первый аналитик закодировал набор данных, он / он не назначил никакой информации об этом.

Поскольку все участники имеют информацию о возрасте (в месяцах), легко определить, когда была первая оценка, когда былавторой и тд.В первой оценке участник был моложе, чем во второй, и так далее.Dataset -- Columns and information

Я использовал инструменты Tidyverse, чтобы справиться с этим, и все работает.Однако я действительно знаю (представьте ...), что есть много других (гораздо более) элегантных решений, и я пришел на этот форум, чтобы попросить об этом.Может ли кто-нибудь подсказать мне, как сделать этот код короче и понятнее?

Это поддельные данные для воспроизведения кода:

ds <- data.frame(id = seq(1:6),
                 months = round(rnorm(18, mean=12, sd=2),0),
                 x1 = sample(0:2), 
                 x2 = sample(0:2),
                 x3 = sample(0:2),
                 x4 = sample(0:2))

#add how many times each child was acessed
ds <- ds %>% group_by(id) %>% mutate(how_many = n())
#Add position
ds %>% group_by(id) %>% 
  mutate(first = min(months), 
         max = max(months), 
         med = median(months)) -> ds

#add label to the third evaluation (the second will be missing)
ds %>% 
  mutate(group = case_when((how_many == 3) & (months %in% first) ~ "First evaluation",
                           (how_many == 3) & (months %in% max) ~ "Third evaluation",
                           TRUE ~ group)) -> ds
#add label to the second evaluation for all children evaluated two times 
ds %>% mutate_at(vars(group), funs(if_else(is.na(.),"Second Evaluation",.))) -> ds

Это мой оригинальный код:

temp <- dataset %>% select(idind, arm, infant_sex,infant_age_months)
#add how many times each child was acessed
temp <- temp %>% group_by(idind) %>% mutate(how_many = n())
#Add position
temp %>% group_by(idind) %>% 
  mutate(first = min(infant_age_months), 
         max = max(infant_age_months), 
         med = median(infant_age_months)) -> temp

#add label to the first evaluation
temp %>% 
  mutate(group = case_when(how_many == 1 ~ "First evaluation")) -> temp

#add label to the second evaluation (and keep all previous results)
temp %>% 
  mutate(group = case_when((how_many == 2) & (infant_age_months %in% first) ~ "First evaluation",
                           (how_many == 2) & (infant_age_months %in% max) ~ "Second evaluation",
                           TRUE ~ group)) -> temp

#add label to the third evaluation (the second will be missing)
temp %>% 
  mutate(group = case_when((how_many == 3) & (infant_age_months %in% first) ~ "First evaluation",
                           (how_many == 3) & (infant_age_months %in% max) ~ "Third evaluation",
                           TRUE ~ group)) -> temp
#add label to the second evaluation for all children evaluated two times 
temp %>% mutate_at(vars(group), funs(if_else(is.na(.),"Second Evaluation",.))) -> temp

Пожалуйста, имейте в виду, что я использовал окно поиска, прежде чем спрашивать об этом, и я действительно представляю, что другие люди могут задавать тот же вопрос при программировании.Большое спасибо

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Или просто упорядочить по возрасту и используйте 1:n() вместо n(), что создает последовательность:

ds <- ds %>% group_by(id) %>% arrange(months) %>% mutate(how_many = 1:n())
ds %>% arrange(id, months)

# A tibble: 18 x 7
# Groups:   id [6]
      id months    x1    x2    x3    x4 how_many
   <int>  <dbl> <int> <int> <int> <int>    <int>
 1     1     10     1     2     0     1        1
 2     1     11     1     2     0     1        2
 3     1     12     1     2     0     1        3
 4     2     11     0     1     2     2        1
 5     2     14     0     1     2     2        2
 6     2     14     0     1     2     2        3

Затем вы можете использовать factor, чтобы прикрепить ярлык, если хотите.

ds$label <- factor(ds$how_many, level = 1:3, label = c("First", "Second","Third"))
head(ds)
# A tibble: 18 x 8
# Groups:   id [6]
      id months    x1    x2    x3    x4 how_many label 
   <int>  <dbl> <int> <int> <int> <int>    <int> <fct> 
 1     1     10     1     2     0     1        1 First 
 2     1     11     1     2     0     1        2 Second
 3     1     12     1     2     0     1        3 Third 
 4     2     11     0     1     2     2        1 First 
 5     2     14     0     1     2     2        2 Second
 6     2     14     0     1     2     2        3 Third 
0 голосов
/ 10 октября 2018

Вот, пожалуйста.Я использовал rank(), чтобы назначить порядок лечения.

ds <- data.frame(id = seq(1:6),
             months = round(rnorm(18, mean=12, sd=2),0),
             x1 = sample(0:2), 
             x2 = sample(0:2),
             x3 = sample(0:2),
             x4 = sample(0:2))

ds2 = ds %>% group_by(id) %>% mutate(rank = rank(months,ties.method="first"))
labels = c("First", "Second","Third")
ds2$labels = labels[ds2$rank] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...