【问题标题】:How to calculate ratios and normalized ratios in all possible combinations in R?如何计算R中所有可能组合的比率和归一化比率?
【发布时间】:2020-07-15 12:52:08
【问题描述】:

我想计算 R 中所有可能组合的归一化比率和简单比率。这是示例数据集

df = structure(list(var_1 = c(0.035, 0.047, 0.004, 0.011, 0.01, 0.01, 
0.024), var_2 = c(0.034, 0.047, 0.004, 0.012, 0.01, 0.011, 0.025
), var_3 = c(0.034, 0.047, 0.006, 0.013, 0.011, 0.013, 0.026), 
    var_4 = c(0.034, 0.046, 0.008, 0.016, 0.014, 0.015, 0.028
    ), var_5 = c(0.034, 0.046, 0.009, 0.017, 0.015, 0.016, 0.029
    )), class = "data.frame", row.names = c(NA, -7L))

在获得this 的帮助后,我可以计算所有可能组合中的简单比率。

do.call("cbind", lapply(seq_along(df), function(y) apply(df, 2, function(x) df[[y]]/x)))

但我无法计算归一化比率,即 (xj - xi)/(xj + xi) 以及如何正确命名每个计算的比率?

【问题讨论】:

  • (df[[y]] - x)/(df[[y]] + x)替换df[[y]] / x怎么样
  • 我会试试的。如何正确命名输出的列?

标签: r combinations tidyverse


【解决方案1】:

也许,您可以尝试嵌套lapply 来获取所有组合:

cols <- 1:ncol(df)
mat <- do.call(cbind, lapply(cols, function(xj) 
          sapply(cols, function(xi) (df[, xj] - df[, xi])/(df[, xj] + df[, xi]))))

要分配列名,我们可以使用outer

colnames(mat) <-  outer(names(df), names(df), paste0)

考虑一下,我认为我们可以使用列索引直接操作它。

cols <- 1:ncol(df)
temp <- expand.grid(cols, cols)
new_data <- (df[,temp[,2]] - df[,temp[,1]])/(df[,temp[,2]] + df[,temp[,1]])

【讨论】:

  • 我们可以在outer函数中使用像“,”这样的分隔符吗?
  • outer(names(df), names(df), paste, sep = ",") ?
  • 对于小型数据集,它可以正常工作。但是我有一个需要很长时间的大型数据集(400 x 2150)。你能为大型数据集提供一些出路吗?
  • 我认为我们可以通过操纵列索引来做到这一点。如果有帮助,请查看更新的答案。
  • 再次计算需要很长时间,并且我的系统正在挂起。我的系统有 16 GB RAM 和 Intel i7 处理器。我应该问一个新问题吗?
【解决方案2】:

单独使用outer 可以更轻松地做到这一点

f1 <- function(i, j) (df[, i] - df[, j])/(df[, i] + df[, j])
out <- outer(seq_along(df), seq_along(df), FUN = f1)
colnames(out) <- outer(names(df), names(df), paste0)

【讨论】:

  • 我已经尝试过您的解决方案。我有一个需要很长时间的大型数据集(400 x 2150)。你能为大型数据集提供一些出路吗?
  • @BappaDas outer 通常应该比嵌套的 lapply/sapplyexpand.grid 快。如果这也需要太多时间,那么您可能需要在 Rcpp 中编写此代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多