簡體   English   中英

在 R 中將嵌套的 For 循環轉換為 `sapply()`

[英]Converting a Nested For Loop into `sapply()` in R

我一直在嘗試使用嵌套的 for 循環創建一系列 coplots,但循環運行時間太長(原始數據集非常大)。 我看過類似的問題,他們建議使用 sapply function 但我仍然不清楚如何在兩者之間進行轉換。我知道我需要創建一個繪圖 function 來使用(見下文)但我不明白是如何嵌套 for 循環的 i 和 j 進入 sapply 爭論。

我已經制作了一些示例數據,我一直在使用的嵌套 for 循環和我創建的繪圖 function 如下所示。 有人可以指導我如何將嵌套的 for 循環轉換為 sapply 爭論。 我一直在 R 中完成所有這些工作。 非常感謝

y = rnorm(n = 200, mean = 10, sd = 2)
x1 = rnorm(n = 200, mean = 5, sd = 2)
x2 = rnorm(n = 200, mean = 2.5, sd = 2)
x3 = rep(letters[1:4], each = 50)
x4 = rep(LETTERS[1:8], each = 25)
dat = data.frame(y = y, x1 = x1, x2 = x2, x3 = x3, x4 = x4)

for(i in dat[, 2:3]){
  for(j in dat[, 4:5]){
    coplot(y ~ i | j, rows = 1, data = dat)
  }
}

coplop_fun = function(data, x, y, x, na.rm = TRUE){
  coplot(.data[[y]] ~ .data[[x]] | .data[[z]], data = data, rows = 1)
}

我們可以使用函數expand.gridformulaapply的組合來接受字符列名到coplot中。

# combinations of column names for plotting
vars <- expand.grid(y = "y", x = c("x1", "x2"), z = c("x3", "x4"))

# cycle through column name variations, construct formula for each combination
apply(vars, MARGIN = 1,
    FUN = function(x) coplot(
        formula = formula(paste(x[1], "~", x[2], "|", x[3])),
        data = dat, row = 1
    )
)
 

我認為您可能可以在這里使用mapply而不是sapply mapply類似於sapply但允許您傳遞兩個輸入而不是一個。

y = rnorm(n = 200, mean = 10, sd = 2)
x1 = rnorm(n = 200, mean = 5, sd = 2)
x2 = rnorm(n = 200, mean = 2.5, sd = 2)
x3 = rep(letters[1:4], each = 50)
x4 = rep(LETTERS[1:8], each = 25)
dat = data.frame(y = y, x1 = x1, x2 = x2, x3 = x3, x4 = x4)

for(i in dat[, 2:3]){
  for(j in dat[, 4:5]){
    coplot(y ~ i | j, rows = 1, data = dat)
  }
}

mapply(function(x,j){coplot(dat[["y"]]~x|j,rows =1)}, dat[,2:3],dat[,4:5])

這是 @nya 解決方案的一個 tidyverse 版本,帶有expand.grid()apply() ds_plot_parameters中的每一行代表一個 plot。 equation變量是最終傳遞給coplot()的字符串。

每個方程都被傳遞給purrr::walk() ,然后調用coplot()來生成一個圖。 as.equation()將字符串轉換為方程。

ds_plot_parameters <- 
  tidyr::expand_grid(
    v = c("x1", "x2"),
    w = c("x3", "x4")
  ) |> 
  dplyr::mutate(
    equation = paste0("y ~ ", v, " | ", w),
  )

ds_plot_parameters$equation |> 
  purrr::walk(
    \(e) coplot(as.formula(e), rows = 1, data = dat)
  )

Gravy :如果您想對圖表進行更多輸入,請擴展ds_plot_parameters以包含其他內容,例如圖表和軸標題。

ds_plot_parameters <- 
  tidyr::expand_grid(
    v = c("x1", "x2"),
    w = c("x3", "x4")
  ) |> 
  dplyr::mutate(
    equation  = paste0("y ~ ", v, " | ", w),
    label_y   = "Outcome (mL)",
    label_x   = paste(v, " (log 10)")
  )

ds_plot_parameters |>
  dplyr::select(
    # Make sure this order exactly matches the function signature
    equation,
    label_x,
    label_y,
  ) |>
  purrr::pwalk(
    .f = \(equation, label_x, label_y) {
      coplot(
        formula = as.formula(equation), 
        xlab    = label_x,
        ylab    = label_y,
        rows    = 1, 
        data = dat
      )
    }
  )


ds_plot_parameters
# # A tibble: 4 x 5
#   v     w     equation    label_y      label_x     
#   <chr> <chr> <chr>       <chr>        <chr>       
# 1 x1    x3    y ~ x1 | x3 Outcome (mL) x1  (log 10)
# 2 x1    x4    y ~ x1 | x4 Outcome (mL) x1  (log 10)
# 3 x2    x3    y ~ x2 | x3 Outcome (mL) x2  (log 10)
# 4 x2    x4    y ~ x2 | x4 Outcome (mL) x2  (log 10)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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