R-循环创建数据框中所有变量的非互惠比率

时间:2017-01-18 16:46:05

标签: r

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

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配对)。

我写的很简单&#34;因为我在...&#34;之前循环,但我不知道从哪里开始。我认为应该有一种方法可以说&#34;从这个变量开始,将其分成剩余的变量,写一个数据帧&#34;,但我不知道如何将它限制为非互惠比率(即如果我有x2 / x1。我不需要x1 / x2)。限制它以及这些集合中的一些具有多达18-20个变量是很重要的。如果它包含所有可能的比率,那么仅仅根据我需要的比率来挖掘数据集会浪费很多时间。

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

1 个答案:

答案 0 :(得分:0)

我们可以使用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="_")) 中1}}

ArrayList