给定数据排列在这样的数据框中:
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个变量是很重要的。如果它包含所有可能的比率,那么仅仅根据我需要的比率来挖掘数据集会浪费很多时间。
我非常感谢您提供的任何帮助!
答案 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