Можно ли сделать этот код более кратким, используя mutate_at или другой подход? - PullRequest
0 голосов
/ 27 мая 2020

Я все еще изучаю R. У меня есть фрагмент кода, и я хотел бы узнать, как сделать его более кратким для моей будущей работы:

test <- function (x,logical) {
  if (logical == FALSE) {
    return (NA)
  }  else{
    return (x)
  }
}

merged_dataframe2 <- merge(merged_dataframe, dataframe, by = "dmt") %>%
                     rowwise() %>%
                     mutate(MaxFlow_logical = case_when(((MaxFlow < (MaxFlow_q1 - MaxFlow_iqr)) | (MaxFlow > (MaxFlow_q3 + MaxFlow_iqr))) ~ FALSE,
                                                          TRUE ~ TRUE),
                            Morning_mean_logical = case_when(((Morning_mean < (Morning_mean_q1 - Morning_mean_iqr)) | (Morning_mean > (Morning_mean_q3 + Morning_mean_iqr))) ~ FALSE,
                                                               TRUE ~ TRUE),
                            Afternoon_mean_logical = case_when(((Afternoon_mean < (Afternoon_mean_q1 - Afternoon_mean_iqr)) | (Afternoon_mean > (Afternoon_mean_q3 + Afternoon_mean_iqr))) ~ FALSE,
                                                                 TRUE ~ TRUE),
                            Evening_mean_logical = case_when(((Evening_mean < (Evening_mean_q1 - Evening_mean_iqr)) | (Evening_mean > (Evening_mean_q3 + Evening_mean_iqr))) ~ FALSE,
                                                               TRUE ~ TRUE),
                            Morn_cons_logical = case_when(((Morn_cons < (Morn_cons_q1 - Morn_cons_iqr)) | (Morn_cons > (Morn_cons_q3 + Morn_cons_iqr))) ~ FALSE,
                                                            TRUE ~ TRUE),
                            Eve_cons_logical = case_when(((Eve_cons < (Eve_cons_q1 - Eve_cons_iqr)) | (Eve_cons > (Eve_cons_q3 + Eve_cons_iqr))) ~ FALSE,
                                                           TRUE ~ TRUE),
                            min_night_flow_logical = case_when(((min_night_flow < (min_night_flow_q1 - min_night_flow_iqr)) | (min_night_flow > (min_night_flow_q3 + min_night_flow_iqr))) ~ FALSE,
                                                                 TRUE ~ TRUE),
                            mean_night_flow_logical = case_when(((mean_night_flow < (mean_night_flow_q1 - mean_night_flow_iqr)) | (mean_night_flow > (mean_night_flow_q3 + mean_night_flow_iqr))) ~ FALSE,
                                                                  TRUE ~ TRUE),
                            Morning_mean = test(Morning_mean,Morning_mean_logical),
                            Afternoon_mean = test(Afternoon_mean,Afternoon_mean_logical),
                            Evening_mean = test(Evening_mean,Evening_mean_logical),
                            Morn_cons = test(Morn_cons,Morn_cons_logical),
                            Eve_cons = test(Eve_cons,Eve_cons_logical),
                            min_night_flow = test(min_night_flow,min_night_flow_logical),
                            mean_night_flow = test(mean_night_flow,mean_night_flow_logical))

Можно ли использовать mutate_at, чтобы сделать это более кратким?

Я использовал case_when для вывода логических столбцов. Есть ли способ объединить эти шаги, чтобы не создавать логические столбцы. Примерно так:

MaxFlow_logical = case_when(((MaxFlow < (MaxFlow_q1 - MaxFlow_iqr)) | (MaxFlow > (MaxFlow_q3 + MaxFlow_iqr))) ~ NA, TRUE ~ MaxFlow)

Однако это не работает, есть ли альтернатива?

1 Ответ

1 голос
/ 27 мая 2020

Я бы порекомендовал функцию ifelse. Это краткий способ применения значения «или / или»:

ifelse(logical_condition, value_if_yes, value_if_no)

Существует также if_else, который имеет несколько другие свойства возврата.

Таким образом, ваш код становится:

df2 <- merge(merged_dataframe, dataframe, by = "dmt") %>%
         rowwise() %>%
         mutate(Morning_mean = ifelse(Morning_mean < (Morning_mean_q1 - Morning_mean_iqr)
                                    | Morning_mean > (Morning_mean_q3 + Morning_mean_iqr),
                NA,
                Morning_mean)

И аналогично для каждой второй строки

...