R:如何使用以下形式的结果创建矩阵而不使用循环

时间:2015-12-22 21:02:07

标签: r dataframe apply

这是一个例子。我有3个变量(实际上是10.000),我只是通过对这些变量的平均值来创建一个新变量。例如,只是变量x1和x3(在示例中)。

输出是创建一个矩阵,其结果是在变量和新变量之间使用损失度量。正如您在示例中看到的那样。我想概括一下这个例子,其中新变量不仅仅是2或3个变量的平均值,它可以是5.000变量,然后进行结果计算

我将不胜感激的任何帮助。

 x<-data.frame(x1= runif(10,min = 0,max = 2000), x2=runif(10,min = 0,max = 1000), x3= runif(10,min = 0,max = 14000))

 y1<- rowMeans(x[,c("x1","x2")])

 y2<- rowMeans(x[,c("x1","x3")])

 y3<- rowMeans(x)

 results<-cbind(0.5*abs(x$x1-y1)+0.5*abs(x$x2-y1),
0.5*abs(x$x1-y2)+0.5*abs(x$x3-y2), 
0.33*abs(x$x1-y3)+0.33*abs(x$x3-y3)+0.34*abs(x$x2-y3))

更新:

实际上意味着人们可以留下不止一列。不只是一个。但也是使用所有列的情况。

1 个答案:

答案 0 :(得分:1)

这可以通过以下方式更有效地完成:

cbind( 
rowMeans( abs( x[-3] - rowMeans(x[-3])  )  ),
rowMeans( abs( x[-2] - rowMeans(x[-2])  )  ),
rowMeans( abs( x - rowMeans(x)  )  )
     )

它并不准确,因为最后一栏实际上是:

(1/3)*abs(x$x1-y3)+(1/3)*abs(x$x3-y3)+(1/3)*abs(x$x2-y3))

此函数将在留一法(任意数量的列基础:

)上返回该指标
L1.leaveout <- function(dfrm,cidx) rowMeans( abs(dfrm[-cidx]  - rowMeans(dfrm[-cidx])))

对于您提供的特定示例,它可以以您这种方式请求的形式进行部署:

do.call( cbind, c( lapply(2:length(x),     #leave out each singly except first
                   function(z) L1.leaveout(x, z) ),
               list(rowMeans( abs( x-rowMeans(x) ) ))  # last column
              )
   )