R语言 使用现有列根据公用字符串改变新列

dkqlctbz  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(98)

样本数据:

X_5   X_1     Y alpha_5 alpha_1 beta_5 beta_1
  <dbl> <dbl> <dbl>   <dbl>   <dbl>  <dbl>  <dbl>
1  0.21  0.02  0.61   10      5       3      0.01
2  0.01  0.02  0.37    0.4    0.01    0.8    0.5 
3  0.02  0.03  0.55    0.01   0.01    0.3    0.99
4  0.04  0.05  0.29    0.01   0.005   0.03   0.55
5  0.11  0.1  -0.08    0.22   0.015   0.01   0.01
6  0.22  0.21 -0.08    0.02   0.03    0.01   0.01

我有一个数据集,其中包含一些感兴趣的变量(如alpha、beta等)的列。我还将其保存为字符向量。我希望能够基于这些变量名称(后缀为标识符)来变异新列,使用数据集中现有的列作为某些转换的一部分,如下所示:

df %>% mutate(
  alpha_new = ((alpha_5-alpha_1) / (X_5-X_1) * Y),
  beta_new = ((beta_5-beta_1) / (X_5-X_1) * Y)
)

    X_5   X_1     Y alpha_5 alpha_1 beta_5 beta_1 alpha_new beta_new
  <dbl> <dbl> <dbl>   <dbl>   <dbl>  <dbl>  <dbl>     <dbl>    <dbl>
1  0.21  0.02  0.61   10      5       3      0.01   16.1        9.60
2  0.01  0.02  0.37    0.4    0.01    0.8    0.5   -14.4      -11.1 
3  0.02  0.03  0.55    0.01   0.01    0.3    0.99    0         38.0 
4  0.04  0.05  0.29    0.01   0.005   0.03   0.55   -0.145     15.1 
5  0.11  0.1  -0.08    0.22   0.015   0.01   0.01   -1.64       0   
6  0.22  0.21 -0.08    0.02   0.03    0.01   0.01    0.0800     0

在我的真实数据中,我有很多这样的列,我很难以一种"整洁"的方式实现它,这种方式不是硬编码的,什么是适合我的情况的最佳实践?
样本代码:

structure(
  list(
    X_5 = c(0.21, 0.01, 0.02, 0.04, 0.11, 0.22),
    X_1 = c(0.02,
            0.02, 0.03, 0.05, 0.10, 0.21),
    Y = c(0.61, 0.37, 0.55, 0.29, -0.08, -0.08),
    alpha_5 = c(10, 0.4, 0.01, 0.01, 0.22, 0.02),
    alpha_1 = c(5, 0.01, 0.01, 0.005, 0.015, 0.03),
    beta_5 = c(3, 0.8, 0.3, 0.03, 0.01, 0.01),
    beta_1 = c(0.01, 0.5, 0.99, 0.55, 0.01, 0.01)
  ),
  row.names = c(NA, -6L),
  class = c("tbl_df", "tbl", "data.frame")
) -> df

variable_of_interest <- c("alpha", "beta")
ou6hu8tu

ou6hu8tu1#

最好先透视数据

library(dplyr)
library(tidyr)

# your data
df <- structure(list(X_5 = c(0.21, 0.01, 0.02, 0.04, 0.11, 0.22), X_1 = c(0.02, 
0.02, 0.03, 0.05, 0.1, 0.21), Y = c(0.61, 0.37, 0.55, 0.29, -0.08, 
-0.08), alpha_5 = c(10, 0.4, 0.01, 0.01, 0.22, 0.02), alpha_1 = c(5, 
0.01, 0.01, 0.005, 0.015, 0.03), beta_5 = c(3, 0.8, 0.3, 0.03, 
0.01, 0.01), beta_1 = c(0.01, 0.5, 0.99, 0.55, 0.01, 0.01)), class = "data.frame", row.names = c(NA, 
-6L))
df <- df |> mutate(id = 1:n()) |> 
  pivot_longer(cols = -c(id, Y, X_5, X_1), 
               names_to = c("name", ".value"),  names_sep="_") |> 
  mutate(new= (`5` - `1`) / (X_5 - X_1) * Y) |>
  pivot_wider(id_cols = id, names_from = "name", values_from = c(`5`,`1`, `new`), 
               names_glue = "{name}_{.value}", values_fn = sum)

df
#> # A tibble: 6 × 7
#>      id alpha_5 beta_5 alpha_1 beta_1 alpha_new beta_new
#>   <int>   <dbl>  <dbl>   <dbl>  <dbl>     <dbl>    <dbl>
#> 1     1   10      3      5       0.01   16.1        9.60
#> 2     2    0.4    0.8    0.01    0.5   -14.4      -11.1 
#> 3     3    0.01   0.3    0.01    0.99    0         38.0 
#> 4     4    0.01   0.03   0.005   0.55   -0.145     15.1 
#> 5     5    0.22   0.01   0.015   0.01   -1.64       0   
#> 6     6    0.02   0.01   0.03    0.01    0.0800     0

创建于2023年2月16日,使用reprex v2.0.2
注意:如果您想在输出中添加X_5和X_1,请使用id_cols = c(id, X_5, X_1)

相关问题