0

我有一个类似于这样创建的数据框:

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] 定义的一组列中的每一行执行下面的等式(在示例中,列虚拟 [3:12] 中的列)

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

其中 Xi 是行内和感兴趣的列中的每个单独的值(i表示每一列,即每行有一个 X1、一个 X2、一个 X3... 值),Xmax 是所有这些值中的最大值行(在 dummy$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)))

我也非常感谢能够很好地解释该过程的答案,因此我将更有可能学习,在此先感谢!

4

2 回答 2

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 个数字的向量),当我们执行一些操作时,R 假设我们想要对的每个元素执行该操作向量。

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

于 2013-03-22T17:27:58.833 回答
1

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

vars.to.use <- paste0("X", 1:10)
dummy$TSP <- rowSums((1-(dummy[vars.to.use]/dummy$Xmax))/(length(vars.to.use) - 1))
于 2013-03-22T17:36:25.880 回答