[英]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.