如何从多个相似标记的列中减去彼此?

rog*_*s77 5 r dataframe dplyr

我有一个类似于以下内容的数据集:

在此输入图像描述

我想从星期一的相应值中减去所有星期二的值。因此,生成的第一列将为 Monday_1 - Tuesday_1,生成的第二列将为 Monday_2 - Tuesday_2,依此类推。

这是生成的数据框的样子。

在此输入图像描述

我想保持星期一列的名称相同并选择星期二列。我的真实数据集比这要宽得多,因此不必手动减去要容易得多。理想情况下我想要一个dplyr解决方案。

数据:

df <- structure(list(id = 1:7, Monday_1 = c(4L, 11L, 18L, 6L, 20L, 
5L, 12L), Monday_2 = c(20L, 3L, 20L, 12L, 1L, 10L, 15L), Monday_3 = c(14L, 
20L, 8L, 17L, 4L, 2L, 3L), Monday_4 = c(13L, 8L, 11L, 3L, 12L, 
14L, 17L), Tuesday_1 = c(1L, 14L, 7L, 16L, 2L, 6L, 12L), Tuesday_2 = c(10L, 
8L, 1L, 16L, 10L, 13L, 9L), Tuesday_3 = c(4L, 9L, 9L, 8L, 7L, 
9L, 12L), Tuesday_4 = c(12L, 18L, 3L, 18L, 6L, 11L, 8L)), class = "data.frame", row.names = c(NA, 
-7L))
Run Code Online (Sandbox Code Playgroud)

mni*_*ist 6

使用across可以轻松地为您提供:

df |> 
  mutate(across(.cols = starts_with("Monday")) - across(.cols = starts_with("Tuesday"))) |> 
  select(id, starts_with("Monday"))
#>   id Monday_1 Monday_2 Monday_3 Monday_4
#> 1  1        3       10       10        1
#> 2  2       -3       -5       11      -10
#> 3  3       11       19       -1        8
#> 4  4      -10       -4        9      -15
#> 5  5       18       -9       -3        6
#> 6  6       -1       -3       -7        3
#> 7  7        0        6       -9        9
Run Code Online (Sandbox Code Playgroud)


And*_*erg 2

使用dplyrssummarize

library(dplyr)

df %>% 
  summarize(id, across(starts_with("Monday")) - across(starts_with("Tuesday")))
  id Monday_1 Monday_2 Monday_3 Monday_4
1  1        3       10       10        1
2  2       -3       -5       11      -10
3  3       11       19       -1        8
4  4      -10       -4        9      -15
5  5       18       -9       -3        6
6  6       -1       -3       -7        3
7  7        0        6       -9        9
Run Code Online (Sandbox Code Playgroud)