2013-03-22 68 views
0

跨行代理我有一个类似这将创建一个数据框:创建方程函数中的R

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个细胞大致

什么,我做的目的是实现下面各行等式中由数据定义的一组列的[X:X](在该示例的那些列内虚设[3:12])

TSP = SUM((1-(希/ Xmax))/(n-1))

其中X是感兴趣的列中的行&内的每个单独值(表示每列,即有一个X1,X2的,对于每一行的X3 ...的值),的Xmax是行中所有这些值中最大的那个(在粗糙的$ 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))) 

我也很欣赏解释过程的答案,所以我会更有可能学习,提前致谢!

回答

1

如果您知道要应用该功能的列可以,因为您怀疑使用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)) }) 

R的矢量化,所以当我们在apply传递一个行的函数(该行被作为参数x这将是10个数字的向量通过),当我们执行某些操作ř假设我们想要对矢量的每个元素执行该操作。

因此,在第一个例子中,x/max(x)将返回10个数字的向量,它是该行每列的元素/该行的那些列的最大值。我们还将1 - x/max(x)的每个结果除以列数-1。然后,我们使用从函数返回的sum将这些结果整理为一个值。

+0

1个非常感谢,有一个等式中的小错误(括号中没有包含1-(x/xmax)部分),但是我已经编辑了答案,它现在可以工作了! – Ell 2013-03-22 17:37:33

+1

没问题!但仔细看看你上面发布的公式*。你有一个额外的大括号,所以我不知道该把它放在哪里。 – 2013-03-22 17:38:39

+0

谢谢,我已经编辑了问题中的等式(星期五晚了很长时间之后,它肯定会发生!) – Ell 2013-03-22 17:45:48

1

更量化的解决方案是对所有元素执行内功能,然后用高效rowSums函数这样执行每行的sum操作:

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

这不起作用,因为用粘贴制作的矢量在“X”和数字之间留有空格,我的实际数据也是一系列单词,我想在这种情况下它会是“vars.to.use < -c( “var.a”, “var.b”, “GHE”, “J45” ...)“?感谢您的建议 – Ell 2013-03-23 09:55:58

+0

@ rg255而不是像我一样使用'paste0',或者'paste(...,sep =“”)'并且您是对的,只需将'vars.to.use'替换为列的名称或列的索引。两者都应该工作! – adibender 2013-03-23 12:16:54