R语言 使新的柱发生突变,并使它们与旧的柱插层

u5rb5r59  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(179)

我想使用across创建新的列,并且新的列与旧的列插入。在本例中,我手动重新定位列以显示所需的输出。但是我想自动地这样做,就像我在mutate中的尝试一样,这显然不起作用。

library(dplyr)

df <- tibble(a = 1:2, x_b = 1:2, x_c = 1:2)

df |> 
  mutate(across(starts_with("x_"), 
                ~ .x * 2, 
                .names = "{sub('x_', 'y_', .col)}"),
         .after = c(x_b, x_c)) |> 
  relocate(y_b, .after = x_b) |> 
  relocate(y_c, .after = x_c)

#> # A tibble: 2 × 5
#>       a   x_b   y_b   x_c   y_c
#>   <int> <int> <dbl> <int> <dbl>
#> 1     1     1     2     1     2
#> 2     2     2     4     2     4

创建于2023-05-18带有reprex v2.0.2

3htmauhk

3htmauhk1#

我们可以创建一个tibble/data.frame,使用.unpack选项并重命名列

library(dplyr)
library(stringr)
df %>%
  mutate(across(starts_with("x_"), 
                ~ data.frame(x = .x, y = .x * 2), .unpack = TRUE),
   .keep = 'unused') %>% 
 rename_with(~ str_replace(.x, "x_(.)_(.)", "\\2_\\1"))
  • 输出
# A tibble: 2 × 5
      a   x_b   y_b   x_c   y_c
  <int> <int> <dbl> <int> <dbl>
1     1     1     2     1     2
2     2     2     4     2     4
mhd8tkvw

mhd8tkvw2#

我经常使用的一个肮脏的解决方法:

library(tidyverse)

prefix <- c('x_', 'y_')
suffix <- c('b', 'c')

col_order <- paste0(prefix, rep(suffix, each = length(prefix)))

df %>%
  select(a, all_of(col_order))

# A tibble: 2 x 5
      a   x_b   y_b   x_c   y_c
  <int> <int> <dbl> <int> <dbl>
1     1     1     2     1     2
2     2     2     4     2     4
mrwjdhj3

mrwjdhj33#

这个结果符合你的要求吗?如果可能,请提供预期的输出。

library(dplyr)
df <- tibble(a = 1:2, x_b = 1:2, x_c = 1:2)
df %>%
  mutate(across(starts_with("x_"), 
                ~ .x * 2, 
                .names = "{sub('x_', 'y_', .col)}"),
         .after = c(x_b, x_c)) %>%
  relocate(starts_with("y_"), .after = starts_with("x_"))

输出:

# A tibble: 2 × 5
      a   x_b   x_c   y_b   y_c
  <int> <int> <int> <dbl> <dbl>
1     1     1     1     2     2
2     2     2     2     4     4

相关问题