首页 > 解决方案 > 使用 r 中 dplyr 中的 mutate_all() 将 df 中的每一列除以其他列

问题描述

我正在尝试将数据框中的每一列除以其他列。从具有 A、B、C 列的数据框开始。我想以包含 B/A、C/A、A/B、C/B、A/C 和 B/C 列的数据框结束。我找到了一种方法来做到这一点,这需要我为每个分母编写一个函数,但如果我可以通过定义一个函数来做到这一点,我会更喜欢它。

我在这里找到了一个类似但不相同的问题。在R中将每一列除以它之前的列

如果可能的话,我想使用 dplyr 来解决这个问题。

这是我得到的最接近的。

## create example data frame

df <- data.frame(A=rnorm(10),
                 B=rnorm(10),
                 C=rnorm(10),)

## calculate ratios

ratio_df <- df%>%
     mutate_all(.funs = funs(A=./A,
                             B=./B,
                             C=./C))

这将返回包含 A/A、B/A、C/A、A/B、B/B、C/B、A/C、B/C、C/C 列的所需结果。我可以很容易地过滤掉 A/A、B/B 和 C/C 给出所需的结果,但是当有大量列时它很笨重。

有没有办法在不编写每个单独的函数的情况下实现这一点?

标签: rdplyr

解决方案


另一个使用purrrwhich 的答案也将具有您指定的列命名:

library(tidyverse)

df %>% 
  select_if(is.numeric) %>% 
  map(~./df %>% select_if(is.numeric)) %>% 
  imap(~set_names(.x, paste0(names(.x), "_", .y))) %>% 
  bind_cols()

推荐阅读