簡體   English   中英

將參數傳遞給 dplyr 中 group_by 的函數

[英]Passing argument into function for group_by in dplyr

我正在嘗試在 dplyr (R) 的函數調用中使用 group_by,但我得到了意想不到的結果。 這是我正在嘗試做的一個例子:

df = data.frame(a = c(0,0,1,1), b = c(0,1,0,1), c = c(1,2,3,4))

result1 = df %>%
  group_by(a,b) %>%
  mutate(d = sum(c))
result1$d

myFunc <- function(df, var) {
  output = df %>%
    group_by(a,!!var) %>%
    mutate(d = sum(c))
  return(output)
}

result2 = myFunc(df,"b")
result2$d

result1$d 產生 [1,2,3,4] 這是我所期望的。 result2$d 產生我不想要的 [3,3,7,7] ,我不確定發生了什么。

它可以將 b(不帶引號)作為函數參數,並用 {{var}} 代替 !!var。 不幸的是,在我的情況下,我的列名是字符串格式(但也許有一種方法可以預先轉換字符串,以便它可以使用 {{}} 表示法?)

如果你想傳遞一個可以引用數據框某一列的字符對象,你應該使用!!sym(var)

myFunc <- function(df, var) {
  output = df %>%
    group_by(a, !!sym(var)) %>%
    mutate(d = sum(c))
  return(output)
}

myFunc(df, "b")

如果你想傳遞一個數據屏蔽參數,你應該使用{{ var }}或等效!!enquo(var)

myFunc <- function(df, var) {
  output = df %>%
    group_by(a, {{ var }}) %>%
    mutate(d = sum(c))
  return(output)
}

myFunc(df, b)

請注意,在兩種不同的情況下,我分別將"b"b傳遞給函數。

如果我們想使用引用和取消引用而不是 curlycurly {{}} ,我們應該考慮這個基本過程: https ://tidyeval.tidyverse.org/dplyr.html

圍繞 dplyr 管道創建函數涉及三個步驟:抽象、引用和取消引用。

1. 抽象步驟:

  • 在這里,我們確定了不同的步驟。 在我們的例子中vargroup_by

2.報價步驟:

  • 識別允許用戶直接引用數據框列的所有參數。
  • 該函數無法立即評估這些參數。
  • 相反,它們應該被自動引用。 enquo()應用於這些參數

3. 取消報價步驟:

  • 確定這些變量在何處傳遞給其他引用函數並使用!!取消引用 .
  • 在這種情況下,我們將var傳遞給group_by()
myFunc <- function(df, var) {
  var <- enquo(var)
  output = df %>%
    group_by(a,!!var) %>%
    mutate(d = sum(c))
  return(output)
}

result2 = myFunc(df,b)

輸出:

[1] 1 2 3 4

就像我發布一個問題一樣,我遇到了一些有用的東西......

myFunc <- function(df, var) {
  output = df %>%
    group_by_at(.vars = c("a",var)) %>%
    mutate(d = sum(c))
  return(output)
}

result2 = myFunc(df,"b")

暫無
暫無

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

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