R 是否可以使用mutate_at或使用其他方法使此代码更简洁?

R 是否可以使用mutate_at或使用其他方法使此代码更简洁?,r,dplyr,tidyverse,mutate,R,Dplyr,Tidyverse,Mutate,我仍在学习R。我有一段代码,我想学习如何使其更简洁,以便将来的工作: test <- function (x,logical) { if (logical == FALSE) { return (NA) } else{ return (x) } } merged_dataframe2 <- merge(merged_dataframe, dataframe, by = "dmt") %>% rowwise

我仍在学习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))
test%
当((MaxFlow<(MaxFlow\u q1-MaxFlow\u iqr))(MaxFlow>(MaxFlow\u q3+MaxFlow\u iqr))为假时,进行变异(MaxFlow\u logical=case\u),
真~真),
Morning_mean_logical=case_when((Morning_mean_q1-Morning_mean_iqr))(Morning_mean>(Morning_mean_q3+Morning_mean_iqr))~FALSE,
真~真),
午后平均值逻辑=案例(午后平均值<(午后平均值q1-午后平均值iqr))(午后平均值>(午后平均值q3+午后平均值iqr))~FALSE,
真~真),
晚间平均值逻辑=案例时((晚间平均值<(晚间平均值q1-晚间平均值iqr));(晚间平均值>(晚间平均值q3+晚间平均值iqr))~FALSE,
真~真),
Morn_cons_logical=当((Morn_cons<(Morn_cons_q1-Morn_cons_iqr))时的情况(Morn_cons>(Morn_cons_q3+Morn_cons_iqr))~FALSE,
真~真),
Eve_cons_logical=案例(Eve_cons<(Eve_cons_q1-Eve_cons_iqr))(Eve_cons>(Eve_cons_q3+Eve_cons_iqr))~FALSE,
真~真),
min_night_flow_logical=当((min_night_flow<(min_night_flow q1-min_night_flow_iqr))(min_night_flow>(min_night_flow_q3+min_night_flow_iqr))为假时的情况,
真~真),
mean_night_flow_logical=当((mean_night_flow<(mean_night_flow q1-mean_night_flow_iqr))(mean_night_flow>(mean_night_flow_q3+mean_night_flow_iqr))为假时的情况,
真~真),
晨间平均值=测试(晨间平均值,晨间平均值逻辑),
午后平均值=测试(午后平均值,午后平均值逻辑),
晚上平均值=测试(晚上平均值,晚上平均值逻辑),
晨昏=测试(晨昏,晨昏逻辑),
Eve_cons=测试(Eve_cons,Eve_cons逻辑),
最小夜间流量=测试(最小夜间流量,最小夜间流量逻辑),
平均夜间流量=测试(平均夜间流量,平均夜间流量逻辑))
有没有可能使用一个变种来让它更简洁

我在输出逻辑列时使用了case_。有没有一种方法可以组合这些步骤,这样就不必创建逻辑列。大概是这样的:

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

但是这不起作用,是否有其他选择?

我建议使用
ifelse
功能。这是一种应用或/或值的简明方法:

ifelse(逻辑条件、值如果是、值如果否)
还有
if_else
,它的返回属性略有不同

这样,您的代码就变成:

df2%
行()
突变(晨间平均值=ifelse(晨间平均值<(晨间平均值q1-晨间平均值iqr)
|上午(上午)是指第三季度+上午(是指iqr),
不,,
早上(你是说)

同样,对于每一行,不要通过比较
FALSE
TRUE
来测试逻辑值,条件
logical==FALSE
应替换为
!logical
isFALSE(logical)
。当直接指定条件值时,您可能不需要
case\u,它们已经是
FALSE/TRUE