我正在处理两个不同的大型数据集,并试图利用mapply()来实现迭代函数的工作。
我们的目标是从Data_1中取每一个数据点,并将其与Data_2列中的两个数据点进行比较,因此,Data_11,1将只与Data_21,1和Data_22,1进行比较。更清楚的是,data1列在Data_1中只会与Data_2中的dataA元素进行比较,因此不会进行交叉列比较。
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.713972Data_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()的逻辑,但是在我调用的函数中仍然有循环,所以这并没有加快代码的速度。基于my earlier question,我正在寻找更好的方法来使用mapply()来实现这一点。
我无法可视化的部分是列对行比较,以及mapply()将如何递归地在其上导航。我如何使用mapply()或lapply()来高效地完成这个任务?
任何建议都会有帮助的,谢谢。
发布于 2017-07-07 01:04:00
考虑嵌套的应用家族调用:
mapply() -外层: Data_1和Data_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发布于 2017-07-05 22:15:31
这是一种基于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)函数返回一个列表列表,列表中的每个元素都是列结果,其元素是一个具有行结果的列表。
关于速度增益,我不能说如果没有基准比较它会有多快,但是它可能会更快的任何循环。
https://stackoverflow.com/questions/44935736
复制相似问题