使用r

时间:2018-11-14 21:54:24

标签: r dplyr

我正在尝试将数据帧中的每一列彼此分开。从具有A,B,C列的数据帧开始。我想以包含B / A,C / A,A / B,C / B,A / C和B / C的数据框结尾。我找到了一种方法来执行此操作,该方法要求我为每个分母编写一个函数,但是如果可以通过定义单个函数来实现,则希望使用该方法。

我在这里找到了一个类似但不完全相同的问题。 Dividing each column by the column before it in 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以获得所需的结果,但是当列数很大时,它很笨拙。

是否有一种无需编写每个函数就能完成此操作的方法?

3 个答案:

答案 0 :(得分:0)

以下是使用purrr的答案。

library(purrr)
library(dplyr)

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

df %>% map(~ . / df) %>% bind_cols()

答案 1 :(得分:0)

那又怎么样:

replace: ''

输出:

do.call(cbind, lapply(df, function(x) x / df))

答案 2 :(得分:0)

使用purrr的另一个答案,该列还将具有您指定的名称:

library(tidyverse)

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