如何用dplyr在R中创建新空列?兼容Spark DataFrame
如何用dplyr基于变量名向量创建全0新列(兼容Spark DataFrame)
你需要用dplyr系列函数基于给定的变量名向量创建全为0的新列,且必须兼容Spark DataFrame,但mutate_at仅支持操作已有列,普通的data.frame或data.table赋值方法无法适配Spark。
兼容Spark的dplyr解决方案
使用mutate()结合tidy eval语法(!!!展开命名列表),这是dplyr官方支持的动态创建列的方法,完全兼容Spark DataFrame:
library(dplyr) new_vars <- c("var1", "var2", "var3") # 核心代码 df <- mtcars %>% mutate(!!!rlang::set_names(rep(list(0), length(new_vars)), new_vars))
代码解释
rep(list(0), length(new_vars)):生成一个包含多个0元素的列表,每个元素对应一个要创建的新列rlang::set_names(..., new_vars):为列表中的每个元素赋予指定的新列名!!!:将命名列表展开为mutate()的多个参数,效果等同于手动编写mutate(var1 = 0, var2 = 0, var3 = 0)
为什么其他方法不行
mutate_at/across:这类函数的设计目标是修改已有列,而非创建新列,传入不存在的列名必然报错- 普通
df[, new_vars] <- 0:Spark DataFrame是不可变(immutable)的分布式数据集,不支持原地赋值操作 data.table的:=语法:仅适用于data.table对象,无法兼容Spark DataFrame
验证Spark兼容性
如果使用sparklyr连接Spark,上述代码可直接运行:
library(sparklyr) # 连接Spark并创建Spark DataFrame sc <- spark_connect(master = "local") mtcars_spark <- copy_to(sc, mtcars) # 创建新列 mtcars_spark %>% mutate(!!!rlang::set_names(rep(list(0), length(new_vars)), new_vars))
内容的提问来源于stack exchange,提问作者TOMC
相关产品推荐
相关产品推荐

