簡體   English   中英

R中具有多個條件的switch語句

[英]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.equalpaired選擇值。 但是,如果將其作為一系列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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM