创建作用于R中各行的方程函数

创建作用于R中各行的方程函数,r,function,equation,R,Function,Equation,我有一个与此创建的数据帧类似的数据帧: dummy=data.frame(c(1,2,3,4),c("a","b","c","d"));colnames(dummy)=c("Num","Let") dummy$X1=rnorm(4,35,6) dummy$X2=rnorm(4,35,6) dummy$X3=rnorm(4,35,6) dummy$X4=rnorm(4,35,6) dummy$X5=rnorm(4,35,6) dummy$X6=rnorm(4,35,6) dummy$X7=rnor

我有一个与此创建的数据帧类似的数据帧:

dummy=data.frame(c(1,2,3,4),c("a","b","c","d"));colnames(dummy)=c("Num","Let")
dummy$X1=rnorm(4,35,6)
dummy$X2=rnorm(4,35,6)
dummy$X3=rnorm(4,35,6)
dummy$X4=rnorm(4,35,6)
dummy$X5=rnorm(4,35,6)
dummy$X6=rnorm(4,35,6)
dummy$X7=rnorm(4,35,6)
dummy$X8=rnorm(4,35,6)
dummy$X9=rnorm(4,35,6)
dummy$X10=rnorm(4,35,6)
dummy$Xmax=apply(dummy[3:12],1,max)
只有真正的是260*13000个细胞

我的目标是将下面的等式实现到由data[x:x]定义的一组列中的每一行(在本例中,这些列位于dummy[3:12]中)

TSP=Sum((1-(Xi/Xmax))/(n-1))

其中席中的每一个值和兴趣列中的每个值(i表示每个列,即每行有一个x1,x2,x3…值),xMAX是行中所有这些值中最大的(如在DimMMy $ XMAX列中定义的),n是所选列的数目(在例子的情况下:n=10)。在实际数据集中,我将选择26列

我想创建一个整洁的小函数来执行这个计算,并将每一行的值存储到一个名为dummy$TSP的列中,并对所有13000行执行此操作

一个粗略的解决方案如下,但正如我所说的,我希望将其放入某种整洁的函数中,在那里我可以选择列,其余的(几乎)是自动的

dummy$TSP<- ((((1-(dummy$X1/dummy$Xmax))/(10-1))
            +(((1-(dummy$X2/dummy$Xmax))/(10-1))
                       ...
            +(((1-(dummy$X10/dummy$Xmax))/(10-1)))

dummy$TSP如果您知道要在上面应用函数的列,您可以使用
apply
在您想要的行上应用函数,就像这样

# Columns you want to use for this function
cols <- c( 3:13 )

# Use apply to loop over rows
dummy$TSP <- apply( dummy[,cols] , 1 , FUN = function(x){ sum( ( 1 - ( x / max(x) ) ) / (length(x) - 1) ) } )
#要用于此函数的列

cols更矢量化的解决方案是对所有元素执行内部函数,然后使用高效的
行和
函数对每行执行
操作,如下所示:

vars.to.use <- paste0("X", 1:10)
dummy$TSP <- rowSums((1-(dummy[vars.to.use]/dummy$Xmax))/(length(vars.to.use) - 1))

vars.to.use+1非常感谢,等式中有一个小错误(1-(x/xmax)部分缺少括号),但我已经编辑了答案,现在可以使用了!没问题!但是仔细看看你上面贴的等式。你有一个额外的大括号,所以我不知道把它放在哪里。谢谢,我已经编辑了问题中的等式(在漫长的一周后的一个星期五晚些时候,这肯定会发生!)这不起作用,因为用粘贴制作的向量在“X”和数字之间留下了一个空格,而且我的数据实际上是一系列单词,我想在这种情况下会是这样的“去吧。use@rg255不是像我那样使用
paste0
,或者“粘贴(…,sep=”“)”的时候,你是对的,只要用列的名称或列的索引替换
vars.to.use
。两者都应该起作用!