使用 dplyr 在 R 中创建新的空列

问题描述 投票:0回答:1

问题

我想使用 dplyr 创建新的空列,基于包含新变量名称的向量。例如,我想创建的列仅包含“0”。这可能很容易,但我找不到解决方案。理想情况下,我会使用 dplyr::mutates 函数(mutate、mutate_at...),因为我需要一个也适用于 spark dataframes 的解决方案。我通常会使用 mutate_at() 但只有当列已经存在时它才有效。

请注意那些说它是重复的

我无法使用tibble::add_column()。不幸的是,我需要一个也适用于 spark dataframes

的解决方案

可重现的示例

library("dplyr")

# --- trying to create 3 new columns
# I would like to do something like this : 
new_vars = c("var1", "var2", "var3")
mtcars %>%
  mutate_at(.vars = new_vars, .funs = ~ 0)
但它会产生错误:
Error in `tbl_at_vars()`:
! Can't subset columns that don't exist.
✖ Column `var1` doesn't exist.

当然,如果列已经存在,它就可以正常工作

mtcars %>% 
  mutate_at(.vars = c('mpg', 'cyl'), .funs = ~ 0)

明显的 data.frame 解决方案,但我需要一个也适用于 spark dataframes

的解决方案
new_vars = c("var1", "var2", "var3")
mtcars[, new_vars]  = 0

显而易见的 data.table 解决方案,但我需要一个也适用于 spark dataframes

的解决方案
library("data.table")
new_vars = c("var1", "var2", "var3")
mtcars_dt = as.data.table(mtcars)
mtcars_dt[, (new_vars) := 0]

谢谢你。

r dplyr data.table tibble sparklyr
1个回答
0
投票

我没有可用的

spark
,但是
arrow
连接是否足够接近所需的内容?

arr <- arrow::arrow_table(mtcars)
Reduce(function(dat, this) mutate(dat, {{this}} := 0), new_vars, init=arr) %>%
  collect()
# # A tibble: 32 × 14
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb  var1  var2  var3
#    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4     0     0     0
#  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4     0     0     0
#  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1     0     0     0
#  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1     0     0     0
#  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2     0     0     0
#  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1     0     0     0
#  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4     0     0     0
#  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2     0     0     0
#  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2     0     0     0
# 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4     0     0     0
# # ℹ 22 more rows
# # ℹ Use `print(n = ...)` to see more rows
© www.soinside.com 2019 - 2024. All rights reserved.