通过dplyr mutate或purrr映射生成新列

通过dplyr mutate或purrr映射生成新列,r,dplyr,purrr,mutate,R,Dplyr,Purrr,Mutate,我有数据帧 set.seed(2021) data.frame(map(0:5, rnorm, n=10))%>% setNames(c('art_1','art_2','vl_1','vl_2','dg_1','dg_2')) art_1 art_2 vl_1 vl_2 dg_1 dg_2 1 -0.12245998 -0.08220485 1.0575567 1.036175 4.116389 4.499709 2

我有数据帧

set.seed(2021)
data.frame(map(0:5, rnorm, n=10))%>%
  setNames(c('art_1','art_2','vl_1','vl_2','dg_1','dg_2'))
         art_1       art_2      vl_1     vl_2     dg_1     dg_2
1  -0.12245998 -0.08220485 1.0575567 1.036175 4.116389 4.499709
2   0.55245663  0.72717482 1.8143150 1.552056 5.760214 2.744131
3   0.34864950  1.18199540 0.8988754 4.019443 3.654884 5.043741
4   0.35963224  2.50854179 3.2081153 1.578583 6.120000 4.631182
5   0.89805369  2.60447011 0.3750615 2.395468 3.965623 4.039778
6  -1.92256952 -0.84147561 2.1053783 1.416526 3.207846 5.103766
7   0.26174436  2.62331021 0.5445567 1.714068 5.475515 5.427289
8   0.91556637  1.13138902 1.6459839 1.545315 3.274443 4.829518
9   0.01377194  2.48112247 1.9063000 2.912929 4.312379 3.450860
10  1.72996316  2.51331829 3.1006686 3.504736 4.691964 3.494400
我需要生成新的专栏“art”,“vl”,“dg”
art=art\u 1/art\u 2
vl=vl_1/vl_2
dg=dg_1/dg_2

不要手动操作


请用
dplyr
非常简单地帮助我。您可以为此使用
mutate
。我建议你做一个快速的
dplyr
教程

library(dplyr)
df <- data.frame(map(0:5, rnorm, n=10))%>% setNames(c('art_1','art_2','vl_1','vl_2','dg_1','dg_2'))

df %>% 
  mutate(art = art_1 / art_2,
         vl = vl_1 / vl_2,
         dg = dg_1 / dg_2)
库(dplyr)
df%集合名(c('art_1'、'art_2'、'vl_1'、'vl_2'、'dg_1'、'dg_2'))
df%>%
变异(艺术=艺术1/艺术2,
vl=vl_1/vl_2,
dg=dg_1/dg_2)

这样就可以了。逐步解释-

  • 在向量中存储不带前缀/后缀的不同变量名,例如
    vars
  • 使用跨
  • 要传递变量名,请使用后缀
    \u 1
    使用!!运算符以及
    glue::glue()
  • 现在。lambda函数中的(.x)将充当这些变量
  • 要更改后缀,请使用
    str\u replace
    get()
  • .name
    参数遵循胶水规范。所以在这里只使用
    '{vars}'
  • 你完了
  • vars%突变(跨越(!!glue::glue({vars}_1'),
    ~./get(str_replace(cur_column(),“1”,“2”)),
    .names='{vars}'))
    art_1 art_2 vl_1 vl_2 dg_1 dg_2 art vl dg
    1  -0.12245998 -0.08220485 1.0575567 1.036175 4.116389 4.499709 1.489692871 1.0206354 0.9148122
    2   0.55245663  0.72717482 1.8143150 1.552056 5.760214 2.744131 0.759730141 1.1689755 2.0991033
    3   0.34864950  1.18199540 0.8988754 4.019443 3.654884 5.043741 0.294966886 0.2236318 0.7246374
    4   0.35963224  2.50854179 3.2081153 1.578583 6.120000 4.631182 0.143363067 2.0322754 1.3214770
    5   0.89805369  2.60447011 0.3750615 2.395468 3.965623 4.039778 0.344812439 0.1565713 0.9816438
    6  -1.92256952 -0.84147561 2.1053783 1.416526 3.207846 5.103766 2.284759642 1.4862969 0.6285252
    7   0.26174436  2.62331021 0.5445567 1.714068 5.475515 5.427289 0.099776368 0.3176985 1.0088859
    8   0.91556637  1.13138902 1.6459839 1.545315 3.274443 4.829518 0.809240992 1.0651445 0.6780061
    9   0.01377194  2.48112247 1.9063000 2.912929 4.312379 3.450860 0.005550689 0.6544272 1.2496535
    10  1.72996316  2.51331829 3.1006686 3.504736 4.691964 3.494400 0.688318376 0.8847081 1.3427095
    
    vielen Dank。你对我帮助很大。
    vars <- c('art','vl','dg')
    
    df %>% mutate(across(!!glue::glue('{vars}_1'), 
                         ~ . / get(str_replace(cur_column(), "1", "2")), 
                         .names = '{vars}'))
    
             art_1       art_2      vl_1     vl_2     dg_1     dg_2         art        vl        dg
    1  -0.12245998 -0.08220485 1.0575567 1.036175 4.116389 4.499709 1.489692871 1.0206354 0.9148122
    2   0.55245663  0.72717482 1.8143150 1.552056 5.760214 2.744131 0.759730141 1.1689755 2.0991033
    3   0.34864950  1.18199540 0.8988754 4.019443 3.654884 5.043741 0.294966886 0.2236318 0.7246374
    4   0.35963224  2.50854179 3.2081153 1.578583 6.120000 4.631182 0.143363067 2.0322754 1.3214770
    5   0.89805369  2.60447011 0.3750615 2.395468 3.965623 4.039778 0.344812439 0.1565713 0.9816438
    6  -1.92256952 -0.84147561 2.1053783 1.416526 3.207846 5.103766 2.284759642 1.4862969 0.6285252
    7   0.26174436  2.62331021 0.5445567 1.714068 5.475515 5.427289 0.099776368 0.3176985 1.0088859
    8   0.91556637  1.13138902 1.6459839 1.545315 3.274443 4.829518 0.809240992 1.0651445 0.6780061
    9   0.01377194  2.48112247 1.9063000 2.912929 4.312379 3.450860 0.005550689 0.6544272 1.2496535
    10  1.72996316  2.51331829 3.1006686 3.504736 4.691964 3.494400 0.688318376 0.8847081 1.3427095