【问题标题】:Is it possible to make this code more concise using mutate_at or by using another approach?是否可以使用 mutate_at 或使用其他方法使此代码更简洁?
【发布时间】:2020-05-27 14:47:32
【问题描述】:

我还在学习 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)

但是这不起作用,是否有替代方法?

【问题讨论】:

  • 不要通过比较FALSETRUE来测试逻辑值,条件logical == FALSE应替换为!logicalisFALSE(logical)
  • 你可能不需要case_when,直接给条件赋值,已经是FALSE/TRUE了。

标签: r tidyverse dplyr


【解决方案1】:

我会推荐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)

每隔一行也是如此

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2012-05-08
    • 2020-10-14
    • 2017-01-17
    • 2021-06-20
    • 2011-05-13
    相关资源
    最近更新 更多