【问题标题】:R- loop to create non-reciprocal ratios of all variables in data frameR-循环创建数据帧中所有变量的非倒数比率
【发布时间】:2017-01-19 23:21:38
【问题描述】:

给定数据排列在这样的数据框中:

x1<-c(1,2,3,4,5)
x2<-c(10,9,8,7,6)
x3<-c(9,2,8,3,7)
x4<-c(2,5,3,4,8)
data<-data.frame(x1, x2, x3, x4)

我想编写一个循环,使用前一个变量对每个变量进行比率。输出应如下所示:

r_x2_x1<-x2/x1
r_x3_x1<-x3/x1
r_x4_x1<-x4/x1
r_x3_x2<-x3/x2
r_x4_x2<-x4/x2
r_x4_x3<-x4/x3
ratios<-data.frame(r_x2_x1, r_x3_x1, r_x4_x1, r_x3_x2, r_x4_x2, r_x4_x3)

我想编写一个循环,按上面显示的顺序对变量进行比率,并且无论数据框中的变量数量如何都可以工作。我还希望输出列名包含一些指示过程中使用了哪些变量的指示(即 r_x2_x1 是我用来表示 2/1 比率的标准格式)。变量并不总是 x1、x2、x3;它们可以是任何数字(通常与 x 配对)。

我之前写过简单的“for i in...”循环,但我什至不知道从哪里开始。我认为应该有一种方法可以说“从这个变量开始,将它分成剩余的变量,写一个数据框”,但我不知道如何将它限制为仅非互易比率(即如果我有 x2/ x1. 我不需要 x1/x2)。限制它很重要,因为其中一些集合有多达 18-20 个变量。如果数据集包含所有可能的比率,那么仅查找我需要的比率会浪费大量时间。

非常感谢您提供的任何帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用combn 来创建列的成对组合,划分,将其保存在list 然后cbind list 元素与do.call 一起

    res <- do.call(cbind, combn(data, 2, FUN= function(x) list(x[2]/x[1])))
    names(res) <- combn(names(data), 2, FUN = function(x) paste(x[2], x[1], sep="_"))
    

    【讨论】:

    • 谢谢。我不知道 combn 命令,所以这很有帮助。我现在唯一的问题是结果数据框只包含比率的分子,并没有指出哪个变量被用作分母。这是我期望的顺序(即我知道比率是多少),但我需要找到一种方法来通过比率的分子和分母重命名新变量。
    • @JenniferMartin 更新了帖子
    • 太好了,非常感谢您的回复。看来combn 将成为我收费箱的方便补充。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多