成对减去数据表中的列
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
我有一个数据。 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