大小不等的两个数据框之间的距离
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,])))
我有两个大小不等的数据框:
>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,])))