大小不等的两个数据框之间的距离

Distance between two data frames of unequal size

我有两个大小不等的数据框:

>df1

    b  c  d
a   2  3  4

>df2

   g  h  i
e  1  1  5
f  0  4  3

我需要通过从 df2 中的每一行中减去 df1 中包含的值来计算这些数据帧的元素之间的距离,因此我想得到:

   c  d  e
a  1  2  1
b  2  1  1

尝试 >myfunc1 <- function(x1,x2){abs(x1 - x2)} myfunc1(df1, df2)df3 <- abs(df2 - df1) 都无济于事,因为大小不等。

require(purrr)

map2_df(df1, df2, ~abs(.x - .y)) 

或者格雷戈尔的方法:abs(df2 - df1[rep(1, nrow(df2)), ])

根据我的有限测试,map2_df 似乎更快

df1 <- fread( "
b  c  d
2  3  4
")

df2 <- fread("    
g  h  i
1  1  5
0  4  3
")

df1 <- rbindlist(replicate(10000, df1, simplify = F))
df2 <- rbindlist(replicate(10000, df2, simplify = F))

require(purrr)
f1 <- function(){
  map2_df(df1, df2, ~abs(.x - .y)) 
}
f2 <- function(){
  abs(df2 - df1[rep(1, nrow(df2)), ]) 
}

library(microbenchmark)

microbenchmark(f1(), f2())

#Unit: microseconds
# expr      min        lq     mean   median       uq      max neval
# f1()  727.385  891.4875 1268.775  956.923 1471.179 4651.075   100
# f2() 1737.025 2011.2815 2666.744 2218.666 2889.846 8572.715   100

如果情况总是第一个矩阵中有一行,那么可以使用基本的 r apply 方法:

t(apply(df2, 1, function(x) abs(x - df1[1,])))