使用 mapply() 进行列行比较
Using mapply() For Column Row Comparison
我正在处理两个不同的大型数据集,并试图利用 mapply()
使迭代函数正常工作。
目标是从 Data_1 中逐列提取每个数据点,并将其与 [= 列中的两个数据点进行比较58=]。因此,Data_1[1,1] 将与 Data_2[1,1] 和 Data_2[2,1] 而已。更清楚地说,data1 列 Data_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_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
我正在处理两个不同的大型数据集,并试图利用 mapply()
使迭代函数正常工作。
目标是从 Data_1 中逐列提取每个数据点,并将其与 [= 列中的两个数据点进行比较58=]。因此,Data_1[1,1] 将与 Data_2[1,1] 和 Data_2[2,1] 而已。更清楚地说,data1 列 Data_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_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