簡體   English   中英

如何在 dplyr::filter() 中插入作為 abs() 字符串的 function 參數?

[英]How to insert function argument that is string to abs() inside dplyr::filter()?

我想將 PCnumber 傳遞給dplyr::filter()內部的abs() function ,但它導致了錯誤。 例如:

df <- data.frame(PC=rnorm(n = 25, mean = 0, sd = 1))
foo <- function(x, PCnumber) {
  PCnumber_load0 <- select(x, PCnumber)
  PCnumber_load <-
    filter(PCnumber_load0, (abs(PCnumber) >= mean(abs(PCnumber))))
  PCnumber_load
}
foo(df, PCnumber="PC")

導致以下錯誤消息。

 Error: Problem with `filter()` input `..1`.
x non-numeric argument to mathematical function
i Input `..1` is `(abs(PCnumber) >= mean(abs(PCnumber)))`.

我已經嘗試使用cat(PCnumber){{PCnumber}}!!PCnumber更改abs()內的PCnumber但沒有一個有效。

謝謝你。

目前,您的 function 將PCnumber變量解釋為一個簡單的字符串,它就是這樣。 您希望將其轉換為 data.frame ( x ) 中包含的變量

您需要使用sym()將字符串轉換為符號,然后可以使用!!

foo <- function(x, PCnumber) {
  PCnumber <- sym(PCnumber)
  PCnumber_load0 <- select(x, !!PCnumber)
  PCnumber_load <-
    filter(PCnumber_load0, (abs(!!PCnumber) >= mean(abs(!!PCnumber))))
  PCnumber_load
}

您必須首先將用戶提供的參數轉換為符號:

library(rlang)

df <- data.frame(PC=rnorm(n = 25, mean = 0, sd = 1))

foo <- function(x, PCnumber) {
  PCnumber <- sym(PCnumber)
  
  PCnumber_load <-
    filter(x, (abs(!!PCnumber) >= mean(abs(!!PCnumber)))) # Then you unquote it with bang bang operator and it's a technic widely used in data masking which is the purpose of tidyverse functions
  
  PCnumber_load
}

foo(df, PCnumber= "PC")

           PC
1   1.1658969
2   0.9449877
3  -2.3434366
4  -1.3040914
5  -1.4638784
6  -0.8324823
7   0.8094797
8   1.4789942
9   1.0667956
10 -0.9972897
11  0.7548202

如果您有任何其他問題,我很樂意解釋更多。

暫無
暫無

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

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