循环计算每列与n列其他列的比率

时间:2017-09-01 15:30:26

标签: r loops permutation

我正在尝试创建一个函数,该函数将使用x列的数据帧,然后输出每列除以每隔一列。所以如果这是我的数据

u<-c(0.05274095, 0.02516572, 0.01747562, 0.03370568, 0.02395228, 0.05950174)
s<-c(0.10016451, 0.18741220, 0.04703746, 0.11089235, 0.13629215, 0.22387265)
m<-c(0.2003734, 0.3691335, 0.3323357, 0.4613755, 0.3095862 ,0.3912790)

mydata<-cbind(u,s,m)

我想要一个带有u / s,u / m,s / u,s / m,m / u,m / s的列。我只能通过

来做到这一点
opponent<-function(mydata){
U<-mydata["u"]
S<-mydata["s"]
M<-mydata["m"]


us<-(U/S)
um<-(U/M)

#etc for all divisions


resultsTable<-data.frame(taxa=rownames(mydata), channels=c(us,um))

return(resultsTable)  }

但我希望该函数能够为n列提供此功能。我可以用循环吗?

1 个答案:

答案 0 :(得分:0)

这是一个combn的方法,它计算向量的n方向组合。然后sapply遍历这些对并返回比率矩阵。

# get pairwise permutations
vars <- combn(colnames(mydata), 2)
vars <- cbind(vars, vars[2:1,])

# calculate the ratios for each pair
done <- sapply(seq_len(ncol(vars)), function(x) mydata[, vars[1, x]] / mydata[, vars[2, x]])
# add column names depicting ratios
colnames(done) <- paste(vars[1, ], vars[2, ], sep="/")

返回

done
           u/s        u/m       s/m      s/u       m/u      m/s
[1,] 0.5265433 0.26321333 0.4998893 1.899179  3.799200 2.000443
[2,] 0.1342801 0.06817512 0.5077085 7.447123 14.668108 1.969634
[3,] 0.3715256 0.05258424 0.1415360 2.691605 19.017105 7.065341
[4,] 0.3039496 0.07305477 0.2403516 3.290020 13.688361 4.160571
[5,] 0.1757422 0.07736869 0.4402397 5.690154 12.925124 2.271490
[6,] 0.2657839 0.15206985 0.5721561 3.762456  6.575925 1.747775