成对减去数据表中的列

subtract columns in the datatable in pairs

我有一个数据。 table

h1 <- c(rnorm(50, mean = 50, sd = 1),
            rnorm(50, mean = 60, sd = 1),
            rnorm(50, mean = 70, sd = 1),
            rnorm(50, mean = 80, sd = 1))

w1 <- c(rnorm(150, mean = 150, sd = 1),
            rnorm(150, mean = 160, sd = 1),
            rnorm(150, mean = 170, sd = 1),
            rnorm(150, mean = 180, sd = 1))

e1 <- c(rnorm(150, mean = 150, sd = 1),
        rnorm(150, mean = 160, sd = 1),
        rnorm(150, mean = 170, sd = 1),
        rnorm(150, mean = 180, sd = 1))

h2 <- c(rnorm(50, mean = 50, sd = 1),
        rnorm(50, mean = 60, sd = 1),
        rnorm(50, mean = 70, sd = 1),
        rnorm(50, mean = 80, sd = 1))

w2 <- c(rnorm(150, mean = 150, sd = 1),
        rnorm(150, mean = 160, sd = 1),
        rnorm(150, mean = 170, sd = 1),
        rnorm(150, mean = 180, sd = 1))

e2 <- c(rnorm(150, mean = 150, sd = 1),
        rnorm(150, mean = 160, sd = 1),
        rnorm(150, mean = 170, sd = 1),
        rnorm(150, mean = 180, sd = 1))

df <- data.frame(h1,w1,e1,h2,w2,e2)

> df
          h1       w1       e1       h2       w2       e2
1   49.85148 148.6694 149.4619 49.05355 151.1857 147.7629
2   49.81708 149.7126 149.1840 50.75627 150.4471 149.2853

我想找出数据列之间的区别。 table?

我想得到的:

h1 w1 e1 h2 w2 e2 h2-h1 w2-w1 e2-e1
49.85148 148.6694 149.4619 49.05355 151.1857 147.7629 -0,79793 2,5163 -1,699

您可以将数据帧分成两半,然后用第一部分减去第二部分,然后分配新的列名。

n <- ncol(df)
col1 <- 1:(n/2)
col2 <- (n/2 + 1):n
new_col_name <- paste(names(df)[col2], names(df)[col1], sep = '-')
df[new_col_name] <- df[col2] - df[col1]
head(df)

#     h1    w1    e1    h2    w2    e2    h2-h1     w2-w1    e2-e1
#1 49.43 149.6 150.2 49.39 149.4 150.1 -0.03665 -0.193458 -0.09741
#2 50.10 149.7 150.8 49.03 149.6 149.6 -1.07812 -0.053813 -1.25975
#3 50.05 149.8 150.7 48.42 149.8 151.0 -1.62448 -0.007319  0.32304
#4 49.77 149.7 148.8 49.92 148.7 149.1  0.15132 -1.005730  0.23139
#5 49.44 149.9 151.0 48.39 150.9 150.0 -1.04673  0.977863 -0.97748
#6 49.58 148.8 151.1 50.41 150.6 148.6  0.83088  1.800697 -2.52930

也许是这样:

library(tidyverse)

str_sub(names(df), 1, 1) %>%
    unique() %>% 
    map_dfc(~ select(df,starts_with(.x)) %>% transmute('{.x}1-{.x}2' := .[, 1] - .[, 2])) %>% 
    {bind_cols(df, .)} %>% as.tibble()
#> Warning: `as.tibble()` was deprecated in tibble 2.0.0.
#> Please use `as_tibble()` instead.
#> The signature and semantics have changed, see `?as_tibble`.
#> # A tibble: 600 x 9
#>       h1    w1    e1    h2    w2    e2 `h1-h2` `w1-w2` `e1-e2`
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>
#>  1  49.6  152.  151.  48.4  151.  148.  1.22     1.13    2.90 
#>  2  50.1  150.  150.  51.6  150.  150. -1.50    -0.301   0.552
#>  3  50.9  150.  150.  50.4  151.  148.  0.474   -1.28    1.64 
#>  4  51.6  149.  152.  51.0  150.  149.  0.599   -0.613   2.78 
#>  5  50.2  149.  150.  51.4  150.  152. -1.27    -1.24   -2.44 
#>  6  50.9  149.  152.  50.2  151.  151.  0.682   -2.18    0.815
#>  7  49.4  149.  149.  49.0  151.  149.  0.315   -2.57   -0.858
#>  8  50.3  151.  152.  50.4  148.  149. -0.0959   2.38    2.70 
#>  9  50.3  151.  151.  49.0  150.  150.  1.30     0.611   0.749
#> 10  51.5  149.  150.  50.0  150.  149.  1.47    -1.21    0.366
#> # … with 590 more rows

reprex package (v2.0.0)

于 2021-06-25 创建

拆分名称和减去名称的变体:

sel <- names(df)[endsWith(names(df), "1")]
df[sprintf("%1$s1-%1$s2", sub("[12]$", "", sel))] <- df[sel] - df[sub("1", "2", sel)]

head(df)
#        h1       w1       e1       h2       w2       e2      h1-h2      w1-w2      e1-e2
#1 49.93223 150.9997 149.2362 50.34892 150.3622 148.6164 -0.4166869  0.6375487  0.6198452
#2 48.83462 149.7938 150.9722 49.24049 150.0979 149.2758 -0.4058752 -0.3040331  1.6964756
#3 49.55578 146.8567 149.4173 48.61832 150.7250 148.2298  0.9374638 -3.8682714  1.1875108