在R中工作,我希望Arrow对变量中指定的一组列求和.

library(arrow) 
library(dplyr)

example_data = InMemoryDataset$create(data.frame(a1 = c(1,2,3), b2=c(4,5,6), c3=c(7,8,9)))
cols_to_sum = c('a1','b2','c3')

Arrow能够做到这一点:

example_data %>% mutate(computed_sum = a1+b2+c3)  %>% compute()

#Succeeds

但是,我希望传递变量,而不是显式地指定列.我通常使用的dplyr语法不适用于Arrow:

example_data %>% 
  mutate(computed_sum = rowSums(across(all_of(cols_to_sum))))  %>% 
  compute()

#Error: Expression rowSums(across(all_of(cols_to_sum))) not supported in Arrow
#Call collect() first to pull data into R.

使用parse()和val()重新构建文字输入字符串确实有效,但对于本应是常见操作的操作来说,这似乎是一种繁琐的解决办法:

temp_expression =  parse( text=paste(cols_to_sum, collapse = '+') )
example_data %>% 
  mutate(computed_sum = eval(temp_expression) )  %>% 
  compute()

#Succeeds

但是,在没有显式临时变量的情况下,上述过程失败:

example_data %>% 
  mutate(computed_sum = eval( parse( text=paste(cols_to_sum, collapse = '+') ) ) )  %>% 
  compute()

#Error: Expression eval(parse(text = paste(cols_to_sum, collapse = "+"))) not supported in Arrow                                                                               
#Call collect() first to pull data into R. 

使用Arrow的R接口在变量中列出的列上指定递归计算(例如,SUM)的正确/最佳/预期方式是什么?要实现这一点,我需要构建字符串并对它们求值()吗?

非Arrow解决方案对我不起作用.我正在处理的数据对于内存来说太大了,这些数据以配置单元分区的形式分发,并由Arrow的Open_DataSet()访问.

推荐答案

我不知道为什么,但如果您将递归代码存储在一个函数(命名的或匿名的)中,它将允许您运行递归代码(或者更简单地用Reduce编写):

library(arrow) 
library(dplyr)

example_data = InMemoryDataset$create(data.frame(a1 = c(1,2,3), b2=c(4,5,6), c3=c(7,8,9)))
cols_to_sum = c('a1','b2','c3')

f <- function(...) Reduce(`+`, list(...))

example_data %>%
  mutate(computed_sum = f(!!!syms(cols_to_sum))) %>%
  collect()
#>   a1 b2 c3 computed_sum
#> 1  1  4  7           12
#> 2  2  5  8           15
#> 3  3  6  9           18

# calling directly errors out
example_data %>% mutate(computed_sum = Reduce(`+`, syms(cols_to_sum)))
#> Error: Expression Reduce(`+`, syms(cols_to_sum)) not supported in Arrow
#> Call collect() first to pull data into R.

# anonymous functions do work
example_data %>% mutate(computed_sum = (function(...) Reduce(`+`, list(...)))(!!!syms(cols_to_sum)))
#> InMemoryDataset (query)
#> a1: double
#> b2: double
#> c3: double
#> computed_sum: double (add_checked(add_checked(a1, b2), c3))
#> 
#> See $.data for the source Arrow object

R相关问答推荐

R dðr按时间间隔进行总结

使用R中的小鼠()进行插补后观察次数显着变化

当y大于阈值和值范围时,在时间序列中突出显示区域

查找满足SpatRaster中条件的单元格位置

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

寻找图片边缘

在R中查找每个组不同时间段的总天数

使用R中相同值创建分组观测指标

如何动态更新selectizeInput?

如何使下一个按钮只出现在Rshiny 的一段时间后?""

从BRM预测价值

使用R中的正则表达式将一列分割为多列

DEN扩展包中的RECT树形图出现异常行为

哪一行和行和 Select 特定行,但是考虑到Nas

扩展R中包含列表的数据框

在R中的数据框上使用Apply()函数时,如何保留非数字列?

如何阻止围堵地理密度图?

用多边形替换地块点

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

按组使用dummy r获取高于标准的行的平均值