在dplyr和sparklyr中将类型动态转换为数字

问题描述

这个问题的关键是,我有一些R代码可以在本地数据帧上正常运行,但是在Spark数据帧上却无法运行,即使其他两个表相同。

在R中,给定一个包含所有字符列的数据框,可以将所有列动态类型转换为数字,并可以使用以下代码将其安全地转换为数字:

require(dplyr)
require(varhandle)
require(sparklyr)

checkNumeric <- function(column)
{
  column %>% as.data.frame %>% .[,1] %>% varhandle::check.numeric(.) %>% all
}

typeCast <- function(df)
{ 
  columns <- colnames(df)
  numericIdx <- df %>% mutate(across(columns,checkNumeric)) %>% .[1,]
  doThese <- columns[which(numericIdx==T)]
  
  df <- df %>% mutate_at(all_of(vars(doThese)),as.numeric)
  return(df)
}

举一个简单的例子,可以运行:

df <- iris
df$Sepal.Length <- as.character(df$Sepal.Length)
newDF <- df %>% typeCast
class(df$Sepal.Length)
class(newDF$Sepal.Length)

现在,此代码不适用于starwars这样的具有复合列的数据集。但是对于其他数据框,我希望此代码在Spark数据框上能正常工作。没有。那是:

sc <- spark_connect('yarn',config=config) # define your Spark configuration somewhere,that's outside the scope of this question
df <- copy_to(sc,iris,"iris")
newDF <- df %>% typeCast

将失败,并出现以下错误。

Error in .[1,] : incorrect number of dimensions

在调试时,如果我们尝试运行此代码:

columns <- colnames(df)
df %>% mutate(across(columns,checkNumeric))

返回此错误: UseMethod(“ escape”)中的错误: 没有适用于“功能”类对象的适用于“转义”的方法

有什么作用?为什么代码在本地数据帧上可以正常工作,而在Spark数据帧上不能正常工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)