使用 mapply() 进行列行比较

Using mapply() For Column Row Comparison

我正在处理两个不同的大型数据集,并试图利用 mapply() 使迭代函数正常工作。

目标是从 Data_1 中逐列提取每个数据点,并将其与 [= 列中的两个数据点进行比较58=]。因此,Data_1[1,1] 将与 Data_2[1,1]Data_2[2,1] 而已。更清楚地说,data1Data_1 只会与 dataA 元素进行比较在 Data_2 中,因此没有跨列比较。

Data_1: NxM

  data1       data2       data3      data4
-0.710003   -0.714271   -0.709946   -0.713645
-0.710458   -0.715011   -0.710117   -0.714157
-0.71071    -0.714048   -0.710235   -0.713515
-0.710255   -0.713991   -0.709722   -0.713972

Data_2: PxQ

  dataA       dataB       dataC      dataD
-0.71097    -0.714059   -0.70928    -0.714059
-0.710343   -0.714576   -0.709338   -0.713644

我之前写过一个for()while()基于循环的算法,但是运行时间和原始数据一样太多了。然后,我转向基于 apply() 的逻辑,但在我调用的函数中仍然有循环,所以这并没有加快代码速度。基于 ,我正在寻找更好的方法来使用 mapply()

我无法想象的部分是列与行的比较以及 mapply() 将如何递归导航。我如何使用 mapply()lapply() 来有效地完成这项工作?

任何建议都会有帮助,谢谢。

这是一种基于 data.table 的解决方案,但如果您使用 data.frame 或矩阵,它应该很容易适应。要达到您想要的效果,您必须使用一个 lapply 而不是另一个 lapply。较高的一个遍历列,它调用另一个遍历行。

library(data.table)

# it gets all elements of column 'j' to do diff computation
get_column_diff <- function(dt_1, dt_2, j){

        get_point_diff <- function(i){
                # it should return a vector with all differences 
                # in comparison of the point (i,j)
                unlist(dt_1[i, ..j]) - unlist(dt_2[, ..j])
        }


        i_rows <- 1:nrow(dt_1)
        lapply(X=i_rows, FUN=get_point_diff)

}

j_cols <- 1:ncol(Data_1)
lapply(FUN=get_column_diff, dt_1=Data_1, dt_2=Data_2, X=j_cols)

函数returns列表的列表,列表的每个元素都是列结果,其元素是包含行结果的列表。

关于速度增益,如果没有基准比较,我不能说它有多快,但可能它会比任何循环更快。

考虑嵌套申请家庭电话:

  • mapply() - 外部:Data_1Data_2 对应列之间的成对迭代
  • sapply - 内部:Data_1列中每个值的向量迭代用于元素比较

下面检查每个 Data_1 值是否介于 Data_2 的每列的两个值之间:

数据

txt = '  data1       data2       data3      data4
-0.710003   -0.714271   -0.709946   -0.713645
-0.710458   -0.715011   -0.710117   -0.714157
-0.71071    -0.714048   -0.710235   -0.713515
-0.710255   -0.713991   -0.709722   -0.713972'

Data_1 <- read.table(text=txt, header=TRUE)

txt = ' dataA       dataB       dataC      dataD
-0.71097    -0.714059   -0.70928    -0.714059
-0.710343   -0.714576   -0.709338   -0.713644'

Data_2 <- read.table(text=txt, header=TRUE)

代码

check_inbetween <- function(x,y){
  sapply(x, function(i) (i > y[1] & i < y[2]))
}

inbetween_matrix <- mapply(check_inbetween, Data_1, Data_2)

inbetween_matrix
#      data1 data2 data3 data4
# [1,] FALSE FALSE FALSE  TRUE
# [2,]  TRUE FALSE FALSE FALSE
# [3,]  TRUE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE  TRUE