2

我尝试使用 lapply 代替与 for 循环一起使用的功能。我对 R 很陌生,对 lapply 不满意。我特别不知道如何制作“如果”条件。

我当前的带有 for 循环的代码看起来像这样(它规范化卷系列):

function(TableVolume,VolumeM,VolumeStD,n){
TableBN = TableVolume[n:nrow(TableVolume),]

for(k in 1:nrow(TableBN)){for (i in 2:ncol(TableBN)){if(!is.na(VolumeM[k,i]) && (VolumeM[k,i]) && (TableVolume[n-1+k,i]>VolumeM[k,i]+1.96/sqrt(n)*VolumeStD[k,i])){TableBN[k,i]=TableVolume[n-1+k,i]/VolumeM[k,i]}else{TableBN[k,i]=0}}}
TableBN=TableBN[n:nrow(TableVolume),]
return(TableBN)
}

我从Apply over two data frames中知道如何执行一个适用于 2 个数据帧的函数,但我仍然看不到如何处理测试。

感谢您的支持,文森特

4

1 回答 1

0

您需要使用lapply(或其他应用家庭功能)。当您有一些非向量化函数应用于向量化参数时,通常需要它。您的函数和条件是算术函数的组合,它们被很好地矢量化了。所以你可以使用子集和ifelse函数请看如下:

set.seed(123)

# simulation
TableBN <- matrix(1:12, nrow = 3)
VolumeM <- matrix(12:1, nrow = 3)
VolumeStD <- matrix(12:1, nrow = 3)
TableVolume <- matrix(abs(rnorm(10)), nrow = 5)


# function
f <- function(TableVolume, VolumeM, VolumeStD, n){
  TableBN <- TableVolume[n:nrow(TableVolume), ]

  ifelse(
    test = !is.na(VolumeM) && VolumeM && TableBN[, -1] > (VolumeM + 1.96 / sqrt(n) * VolumeStD), 
    yes = TableBN[, -1] / VolumeM,
    no = 0)
}

# Test
f(TableVolume, VolumeM, VolumeStD, 3)

输出:

0
于 2018-09-05T14:35:45.913 回答