我正在尝试编写一个函数,该函数接受一个数据框,将列从转换chr
为dbl
,然后将1加到列中。我也想可选替换为特定值NA
。否则,如果不使用相关的参数,我希望函数跳过NA替换步骤。
library(tibble)
library(dplyr)
library(magrittr)
df <-
tibble(id = 1:10, col_of_interest = 21:30) %>%
add_row(id = 11, col_of_interest = 999) %>%
mutate(across(col_of_interest, as.character))
df
## # A tibble: 11 x 2
## id col_of_interest
## <dbl> <chr>
## 1 1 21
## 2 2 22
## 3 3 23
## 4 4 24
## 5 5 25
## 6 6 26
## 7 7 27
## 8 8 28
## 9 9 29
## 10 10 30
## 11 11 999
该功能应:
col_of_interest
从转换chr
为dbl
。999
为NA (但仅当我指定999
应替换为时NA
)1
到col_of_interest
在编写函数时,有两个资源指导我:
add_one <- function(data, var, na_if_val = NULL) {
data %>%
mutate(across({{ var }}, as.numeric)) %>%
{if( is.null( {{ na_if_val }} )
) . # <--- the dot means: "return the preexisting dataframe"
else
na_if( {{ na_if_val }} )
} %>%
mutate(across({{ var }}, add, 1))
}
当我在df
对象上测试该功能时,会出现错误。
add_one(data = df,
var = col_of_interest,
na_if_val = "999")
Error in check_length(y, x, fmt_args("y"), glue("same as
{fmt_args(~x)}")) : argument "y" is missing, with no default
谷歌搜索此错误产生了此页面,指出:
但是请注意,na_if()只能采用长度为1的参数。
但是,仅将其合并na_if( {{ na_if_val }} )
到add_one
功能的管道中是可行的。是条件评估与之结合is.null
,导致功能中断。我不明白为什么。
我通过简单地指定x
和的y
参数解决了这个问题drop_na
。
add_one <- function(data, var, na_if_val = NULL) {
data %>%
mutate(across({{ var }}, as.numeric)) %>%
{if( is.null( {{ na_if_val }} )
) . # <--- the dot means: "return the preexisting dataframe"
else
na_if(x = ., y = {{ na_if_val }} ) ## <-- change is here
} %>%
mutate(across({{ var }}, add, 1))
}
add_one(data = df,
var = col_of_interest,
na_if_val = 999)
## # A tibble: 11 x 2
## id col_of_interest
## <dbl> <dbl>
## 1 1 22
## 2 2 23
## 3 3 24
## 4 4 25
## 5 5 26
## 6 6 27
## 7 7 28
## 8 8 29
## 9 9 30
## 10 10 31
## 11 11 NA
我按照@LionelHenry的评论删除{{ }}
了na_if_val
。
add_one <- function(data, var, na_if_val = NULL) {
data %>%
mutate(across({{ var }}, as.numeric)) %>%
{if( is.null(na_if_val)
) . # <--- the dot means: "return the preexisting dataframe"
else
na_if(x = ., y = na_if_val)
} %>%
mutate(across({{ var }}, add, 1))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句