【发布时间】: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)
但是这不起作用,是否有替代方法?
【问题讨论】:
-
不要通过比较
FALSE或TRUE来测试逻辑值,条件logical == FALSE应替换为!logical或isFALSE(logical)。 -
你可能不需要
case_when,直接给条件赋值,已经是FALSE/TRUE了。