簡體   English   中英

列參考 data.table function R

[英]Column reference data.table function R

我正在嘗試制作一個 function 來調用作為以下 arguments 之一提供的數據表中的列:

df <- read.table(text = "x1 x2 y
CA 20 50
CA 30.5 100
CA 40.5 200
AZ 20.12 400
AZ 25 500
OR 86 600
OR 75 700
OR 45 800", header = TRUE)

df$x1 <- as.factor(df$x1)

library(data.table)

make_freq <- function(df, var_name){
  
  df <- df 
  setDT(df)
  
  
  tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(var_name)]
  
  gg1 <- ggplot(tb, aes(x = var_name, y = prop_)) +
    geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
    ggtitle(paste0("var_name")) +
    theme_bw() +
    theme(plot.title = element_text(size = 10)) +
    theme(axis.text.x = element_text(angle = 45)) 
  
  return(list(figure = gg1))
}

make_freq(df = df, var_name = x1)

理想情況下,我希望能夠運行 function 以便我可以使用var_name參數為我想要的任何分類變量創建 ggplot 圖。 我收到Object x1 not found錯誤,這讓我認為我需要引用或取消引用 function 或其他內容中的var_name參數。

是的,如果您想使用非標准評估,您需要引用var_name參數。 只需添加:

var_name <- substitute(var_name)

到 function 的頂部。 請注意,在這種情況下,默認的 x 軸 label 將是var_name 如果您希望它默認為作為var_name傳遞的任何內容,則需要執行幾個額外的步驟。 將 function 的頂部更改為:

  x <- enquo(var_name)
  var_name <- substitute(var_name)

然后修改tb行。

  tb <- df[, .N, by = eval(deparse(var_name))][,prop_ := round(((N/sum(N))*100), digits = 0)][order(eval(var_name))]

然后在ggplot()

gg1 <- ggplot(tb, aes(x = !!x, y = prop_)) + ...
  1. 你應該引用x1因為你沒有這個 object (這是列的名稱)。
  2. data.table object 中的參數by可能是字符,而df[, .N, by = var_name]是好的代碼。 但是[order(var_name)]是錯誤的。 您可以使用[order(get(var_name))]
  3. 因為var_name是字符,我們需要在 ggplot 中將var_name更改為get(var_name)

完整代碼:

make_freq <- function(df, var_name){
    
    df <- df 
    setDT(df)
    
    
    tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(get(var_name))]
    
    gg1 <- ggplot(tb, aes(x = get(var_name), y = prop_)) +
        geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
        ggtitle(paste0("var_name")) +
        theme_bw() +
        theme(plot.title = element_text(size = 10)) +
        theme(axis.text.x = element_text(angle = 45)) 
    
    return(list(figure = gg1))
}


make_freq(df = df, var_name = "x1")

暫無
暫無

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

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