我正在尝试将数据帧中的每一列彼此分开。从具有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以获得所需的结果,但是当列数很大时,它很笨拙。
是否有一种无需编写每个函数就能完成此操作的方法?
答案 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()