[英]switch statement with multiple conditions in r
我想用三個條件在r中編寫一個switch語句,但似乎無法使其正常工作。 我究竟做錯了什么?
# assigning some values
test.type <- "p"
var.equal<- TRUE
paired <- FALSE
# preparing text for which p-value adjustment method was used
test.description <- switch(
EXPR = test.type & var.equal & paired,
"p" & TRUE & TRUE = "Student's t-test",
"p" & FALSE & TRUE = "Student's t-test",
"p" & TRUE & FALSE = "Student's t-test",
"p" & FALSE & FALSE = "Games-Howell test",
"np" & TRUE & TRUE = "Durbin-Conover test"
)
#> Error: <text>:10:23: unexpected '='
#> 9: EXPR = test.type & var.equal & paired,
#> 10: "p" & TRUE & TRUE =
#> ^
由reprex軟件包 (v0.2.1)創建於2018-11-08
這句話的只有一個條件簡化版本做工作-
# simpler switch
(test.description <- switch(
EXPR = test.type,
"p" = "Student's t-test",
"np" = "Durbin-Conover test"
))
#> [1] "Student's t-test"
由reprex軟件包 (v0.2.1)創建於2018-11-08
這不是R的switch()
函數的工作方式。 從語法上講,這只是一個函數調用,因此選擇器必須是可以被視為名稱的東西,而不是像"p" & TRUE & TRUE
這樣的表達式。 因此,您的第一個開關可以打開test.type
,然后使用if
語句基於var.equal
和paired
選擇值。 但是,如果將其作為一系列if
語句看起來可能會更好,如下所示:
test.description <-
if (test.type == "p" && !var.equal && !paired) "Games-Howell test" else
if (test.type == "p") "Student's t-test" else
if (test.type == "np" && var.equal && paired) "Durbin-Conover test" else
"Unknown combination"
這里要注意一些事情:
if
語句來產生值; 這是一個重要的聲明。 else
關鍵字移至下一行,則將無法正常工作,因為到目前為止的代碼中都有完整的語句,因此else
子句將處於懸空狀態。 (對此有一些例外,但不要依賴它們。) if
測試中使用標量&&
,而不要使用向量&
。 else
放在下一行。 我喜歡上面的格式,但您的偏好可能會有所不同。 另一種解決方案是使用dplyr的case_when
,其語法與switch
語句更相似:
library(dplyr)
## initial dataframe
df <- data.frame(
test.type = c("p", "p", "p", "p", "np", "np"),
var.equal = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE),
paired = c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)
)
## add column test.description
mutate(df,
test.description = case_when(
test.type == "p" & !var.equal & !paired ~ "Games-Howell test",
test.type == "p" ~ "Student's t-test",
test.type == "np" & var.equal & paired ~ "Durbin-Conover test",
TRUE ~ "Unknown combination"
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.