我正在尝试创建一个函数,该函数将使用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列提供此功能。我可以用循环吗?
答案 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