如何通过列索引而不是使用跨列名称来改变多列?

How to mutate several columns by column index rather than column name using across?

基于这个问题:

我想使用列索引对多个列进行变异,例如变异的源和目标:

df <- tribble(~C1,~C2,~C3,1,2,3,4,5,6,7,8,9)
dfn <- df
dfn[,1:2] = dfn[,3]   # like this in dplyr

df <- df %>% mutate(accross(.[[1:2]]) = .[[3]])

给出:

Fehler: Unerwartete(s) '=' in "df <- df %>% mutate(accross(.[[1:2]]) ="
Error: Unexpected '=' in "df <- df %>% mutate(accross(.[[1:2]]) ="

across 的第一个参数可以指定要使用和设置的列,第二个参数是用于转换它们的函数。 across 的第二个参数也可以是 function(x) .[[3]] .

df %>% mutate(across(1:2, ~ cur_data()[[3]]))

给予:

# A tibble: 3 x 3
     C1    C2    C3
  <dbl> <dbl> <dbl>
1     3     3     3
2     6     6     6
3     9     9     9

这些也可以工作,并且都比上面的 运行 快,最后一个是最快的。

df %>% replace(1:2, .[[3]])

library(collapse)
df %>% ftransformv(1:2, function(x) .[[3]])

一个选项可以是:

df %>% 
 mutate(across(1:2, ~ across(3) %>% pull()))

     C1    C2    C3
  <dbl> <dbl> <dbl>
1     3     3     3
2     6     6     6
3     9     9     9