如何在R中编写匿名函数

cyvaqqii  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(167)

我通过arrow包的open_dataset函数打开了一个.parquet数据集。我想使用across一次清理几个数值列。然而,当我运行以下代码时:

start_numeric_cols = "sum"
sales <- sales %>% mutate(
  across(starts_with(start_numeric_cols) & (!where(is.numeric)), 
         \(col) {replace(col, col == "NULL", 0) %>% as.numeric()}),
  across(starts_with(start_numeric_cols) & (where(is.numeric)),
         \(col) {replace(col, is.na(col), 0)})
)
#> Error in `across_setup()`:
#> ! Anonymous functions are not yet supported in Arrow

这个错误消息非常有用,但是我想知道是否有任何方法可以只对across中的dplyr动词执行相同的操作(或者另一种不必键入每个列名的解决方法)。

7fhtutme

7fhtutme1#

arrow有越来越多的函数,可以在不将数据拉入R的情况下使用(可用的here),但replace()尚不支持。但是,您可以使用ifelse()/if_else()/case_when()。还要注意,在常规匿名函数不支持的情况下,支持purrr-style lambda函数。
我没有您的数据,因此将使用iris数据集作为示例来演示查询是否成功构建,即使在此数据的上下文中它没有完全意义。

library(arrow)
library(dplyr)

start_numeric_cols <- "P"

iris %>%
  as_arrow_table() %>%
  mutate(
    across(
    starts_with(start_numeric_cols) & (!where(is.numeric)),
    ~ as.numeric(if_else(.x == "NULL", 0, .x))
  ),
  across(
    starts_with(start_numeric_cols) & (where(is.numeric)),
    ~ if_else(is.na(.x), 0, .x)
  )
)

Table (query)
Sepal.Length: double
Sepal.Width: double
Petal.Length: double (if_else(is_null(Petal.Length, {nan_is_null=true}), 0, Petal.Length))
Petal.Width: double (if_else(is_null(Petal.Width, {nan_is_null=true}), 0, Petal.Width))
Species: dictionary<values=string, indices=int8>

See $.data for the source Arrow object

相关问题