首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mapply()进行列行比较

使用mapply()进行列行比较
EN

Stack Overflow用户
提问于 2017-07-05 20:47:49
回答 2查看 1.1K关注 0票数 2

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

我们的目标是从Data_1中取每一个数据点,并将其与Data_2列中的两个数据点进行比较,因此,Data_11,1将只与Data_21,1和Data_22,1进行比较。更清楚的是,data1列在Data_1中只会与Data_2中的dataA元素进行比较,因此不会进行交叉列比较。

Data_1: NxM

代码语言:javascript
复制
  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

代码语言:javascript
复制
  dataA       dataB       dataC      dataD
-0.71097    -0.714059   -0.70928    -0.714059
-0.710343   -0.714576   -0.709338   -0.713644

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

我无法可视化的部分是列对行比较,以及mapply()将如何递归地在其上导航。我如何使用mapply()lapply()来高效地完成这个任务?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-07 01:04:00

考虑嵌套的应用家族调用:

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

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

数据

代码语言:javascript
复制
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)

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-07-05 22:15:31

这是一种基于data.table的解决方案,但是如果您使用的是data.frame或矩阵,那么应该很容易适应。要达到您想要的目的,您必须使用一个lapply而不是另一个lapply。较高的一个在列上迭代,后者调用另一个对行进行迭代。

代码语言:javascript
复制
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)

函数返回一个列表列表,列表中的每个元素都是列结果,其元素是一个具有行结果的列表。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44935736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档