在R的arrow包中使用across清洗列时替代匿名函数的方案
解决Arrow数据集使用
across时匿名函数不支持的问题 方案1:使用Arrow兼容的dplyr内置函数(推荐)
Arrow的dplyr接口支持用公式形式(~)替代匿名函数,结合dplyr内置的if_else、coalesce等动词实现需求,全程无需将数据拉到内存:
start_numeric_cols = "sum" sales <- sales %>% mutate( # 处理以sum开头的非数值列:替换"NULL"字符串为"0"后转数值类型 across(starts_with(start_numeric_cols) & !where(is.numeric), ~ as.numeric(if_else(.x == "NULL", "0", .x))), # 处理以sum开头的数值列:将NA替换为0 across(starts_with(start_numeric_cols) & where(is.numeric), ~ coalesce(.x, 0)) )
关键说明:
- 用
~定义操作逻辑,.x指代当前遍历的列 if_else是Arrow支持的dplyr条件函数,替代匿名函数里的replace逻辑coalesce直接返回第一个非NA值,是替换NA为固定值的简洁写法,Arrow完全兼容
方案2:将数据拉到内存后使用匿名函数(仅适用于小数据集)
如果你的数据集规模较小,可以先用collect()将Arrow数据集转换为内存中的tibble/data.frame,之后就能正常使用匿名函数:
start_numeric_cols = "sum" sales <- sales %>% collect() %>% 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)) )
注意事项:
- 此方法会将全量数据加载到内存,大数据场景下可能导致内存溢出,谨慎使用
内容的提问来源于stack exchange,提问作者Alberto Agudo Dominguez
相关产品推荐
相关产品推荐

