【问题标题】:Function takes an argument literally rather than the value of the argument函数从字面上接受一个参数而不是参数的值
【发布时间】:2026-01-27 13:50:01
【问题描述】:

我尝试创建一个函数,该函数将根据每个人有多少唯一的 PATIENT_ID 按降序返回 x 最大的 MOLECULES。从某个日期到最后一个日期。

data <- data.frame(PATIENT_ID = c(1,1,2,2), dateM = c(ymd("2020-01-05","2020-01-06","2020-05-06","2019-12-15")), MOLECULES = c("mol1", "mol1", "mol1", "mol2"))


topx <- function(data, datefrom, var ,  x = 5){
  data %>%
  subset(dateM >= datefrom) %>%
  group_by(var) %>%
  summarize(pat = length(unique(PATIENT_ID))) %>%
  arrange(-pat) %>% 
  head(x) %>% 
  select(1)
}

topx(data = data, datefrom = "2016-04", var = MOLECULES, x = 2) 

在这种情况下,想要的结果是:

c("mol1","mol2")

但是,它将 var 作为文本,并且不会解析 MOLECULES 并告诉我。

 Error: Must group by variables found in `.data`.
* Column `var` is not found.

【问题讨论】:

  • 注意,'dplyr' 中还有 slice_max 函数,它的作用非常相似;也就是说,我认为在这里使用它不会有帮助。除此之外,我建议不要将“dplyr”函数与基本的 R 等效函数混合。也就是说,使用filter 而不是subsetfilter 更健壮,在您做错事时提供更好的错误消息,并且还可以通过 {{…}} 处理插值变量。 subset 不会 使用它。原则上,head vs slice_head 也是如此,但这里的论点不那么强烈。

标签: r function dplyr


【解决方案1】:

我认为这是一个准报价问题。 !! 对表达式进行一对一的评估。欲了解更多信息,请参阅https://adv-r.hadley.nz/quasiquotation.html

试试:

topx <- function(data, datefrom, var ,  x = 5){
  var <- enquo(var)
  data %>%
  subset(dateM >= datefrom) %>%
  group_by(!!var) %>%
  summarize(pat = length(unique(PATIENT_ID))) %>%
  arrange(-pat) %>% 
  head(x) %>% 
  select(1)
}

【讨论】:

  • 那行不通,您还需要enquo 变量 - 而{{var}} 会为您进行引用和取消引用/扩展。
  • 确实这行不通,但是,这是一个有用但我不知道的信息
  • 抱歉忘记添加enquo
【解决方案2】:

酷炫功能。使用dplyr 编程时有特殊的规则和操作。查看更多here。具体来说,您需要{{}} 运算符。


library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union

data <- data.frame(PATIENT_ID = c(1,1,2,2), dateM = c(ymd("2020-01-05","2020-01-06","2020-05-06","2019-12-15")), MOLECULES = c("mol1", "mol1", "mol1", "mol2"))

topx <- function(data, datefrom, var ,  x = 5){
  data %>%
    subset(dateM >= datefrom) %>%
    group_by({{var}}) %>%
    summarize(pat = length(unique(PATIENT_ID))) %>%
    arrange(-pat) %>% 
    head(x) %>% 
    select(1)
}

topx(data = data, datefrom = "2016-04-01", var = MOLECULES, x = 2) 
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 1
#>   MOLECULES
#>   <chr>    
#> 1 mol1     
#> 2 mol2

reprex package (v0.3.0) 于 2021-01-14 创建

【讨论】:

  • 后续问题,当我在其预期用途中使用此功能时,即根据 MOLECULES 的某些值是否在顶部 x 中进行汇总,它会抛出我 `summarise()'dateM' 重新组合输出(用.groups 参数覆盖)summarise() 取消分组输出(用.groups 参数覆盖)```,第二条消息重复了48 次。即使我将as.factoras.character 添加到函数的末尾,这种情况仍然存在
  • 在这里查看答案:*.com/questions/62140483/…
最近更新 更多