r - 您可以使用 dplyr cross() 来遍历成对的列吗?

标签 r dplyr tidyverse across

我有 18 对变量,我想对它们进行成对数学计算以计算 18 个新变量。将公式应用于一列时,dplyr 中的 cross() 函数非常方便。有没有办法将 cross() 应用于成对的列?
简单除法 2 个变量的小例子(我的实际代码会更复杂,一些 ifelse,...):

library(tidyverse)
library(glue)

# filler data
df <- data.frame("label" = c('a','b','c','d'),
                 "A" = c(4, 3, 8, 9),
                 "B" = c(10, 0, 4, 1),
                 "error_A" = c(0.4, 0.3, 0.2, 0.1),
                 "error_B" = c(0.3, 0, 0.4, 0.1))

# what I want to have in the end 
# instead of just 2 (A, B), I have 18
df1 <- df %>% mutate(
  'R_A' = A/error_A,
  'R_B' = B/error_B
)

# what I'm thinking about doing to use both variables A and error_A to calculate the new column
df2 <- df %>% mutate(
  across(c('A','B'),
         ~.x/{HOW DO I USE THE COLUMN WHOSE NAME IS glue('error_',.x)}
         .names = 'R_{.col}'
)

最佳答案

一种选择是map/reduce .指定感兴趣的列('nm1'),在 map 中循环它们, select数据集中的那些列,reduce通过除法,rename列绑定(bind)后的列( _dfc ),并将这些列与原始数据集绑定(bind)

library(dplyr)
library(purrr)
library(stringr)
nm1 <- c('A', 'B')
map_dfc(nm1, ~ df %>% 
                select(ends_with(.x)) %>% 
                reduce(., `/`) ) %>%
    rename_all(~ str_c('R_', nm1)) %>%
    bind_cols(df, .)
-输出
#  label A  B error_A error_B R_A      R_B
#1     a 4 10     0.4     0.3  10 33.33333
#2     b 3  0     0.3     0.0  10      NaN
#3     c 8  4     0.2     0.4  40 10.00000
#4     d 9  1     0.1     0.1  90 10.00000

across 的其他选项
df %>% 
    mutate(across(c(A, B), ~ 
     ./get(str_c('error_', cur_column() )), .names = 'R_{.col}' ))
#  label A  B error_A error_B R_A      R_B
#1     a 4 10     0.4     0.3  10 33.33333
#2     b 3  0     0.3     0.0  10      NaN
#3     c 8  4     0.2     0.4  40 10.00000
#4     d 9  1     0.1     0.1  90 10.00000    

关于r - 您可以使用 dplyr cross() 来遍历成对的列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65543579/

相关文章:

r - 使用R-当值重复少于3次时删除行

子集时保留 R 对象的类属性

r - 当其他值全为 0 时,计算特定值相对于所有值之和的百分比

r - 按两行一组汇总

r - 折叠并合并重叠的时间间隔

r - 使用 cowplot 包的多图的居中 X 轴标签

r - 在 R 中合并每月日期

r - 如何将多列中的 NA 替换为同一数据集中其他相应多列的值?

r - 如何在 R 中排列嵌套数据(即带父项的数据)?

r - tidyverse 中的条件 ntile