首页 > 解决方案 > 两个大小不等的数据框之间的距离

问题描述

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

>df1

    b  c  d
a   2  3  4

>df2

   g  h  i
e  1  1  5
f  0  4  3

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

   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)无济于事。

标签: rdataframedistance

解决方案


require(purrr)

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

或者 Gregor 的方法: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

在此处输入图像描述


推荐阅读