两个数值向量的两两相减,并在给定范围内选择结果



我有两个形式为

的数据帧
df.f <- data.frame(ID=c("A_1", "A_2", "A_3"), B=c(130, 250, 330))
df.r <- data.frame(ID=c("B_1", "B_2", "B_3"), B=c(170, 350, 480))
我想两两减去df。f$B from df。r$B(方向很重要),并选择减法值在200和300范围内的那些对。

I know how to outer:

outer(df.r$B, df.f$B, '-')
[,1] [,2] [,3]
[1,]   40  -80 -160
[2,]  220  100   20
[3,]  350  230  150

和可能会熔化生成的矩阵,然后选择值列,但outer不保留名称:

library(reshape2)
res <- melt(as.matrix(outer(df.r$B, df.f$B, '-')))
final <- res[res$value >= 200 & res$value <= 300,]
> final
Var1 Var2 value
2    2    1   220
6    3    2   230

你知道如何达到这样的结果吗:

Var1 Var2 Diff
A_1 B_2 220
A_2 B_3 230

我想这可以通过在原始表中找到索引来完成。

多谢!

您可以在outer之后分配名称:

o <- outer(df.r$B, df.f$B, '-')
dimnames(o) <- list(df.r$ID, df.f$ID)
o
#     A_1 A_2  A_3
# B_1  40 -80 -160
# B_2 220 100   20
# B_3 350 230  150

或对每个向量:

o <- outer(setNames(df.r$B, df.r$ID), setNames(df.f$B, df.f$ID), '-')
o
#     A_1 A_2  A_3
# B_1  40 -80 -160
# B_2 220 100   20
# B_3 350 230  150

熔点:

res <- reshape2::melt(o)
res
#   Var1 Var2 value
# 1  B_1  A_1    40
# 2  B_2  A_1   220
# 3  B_3  A_1   350
# 4  B_1  A_2   -80
# 5  B_2  A_2   100
# 6  B_3  A_2   230
# 7  B_1  A_3  -160
# 8  B_2  A_3    20
# 9  B_3  A_3   150
res[res$value >= 200 & res$value <= 300,]
#   Var1 Var2 value
# 2  B_2  A_1   220
# 6  B_3  A_2   230

或者,您可以执行外部连接(没有merge)和一些简单的赋值:

with(merge(df.f, df.r, by = c()),
data.frame(Var1=ID.x, Var2=ID.y, Diff=B.y-B.x))
#   Var1 Var2 Diff
# 1  A_1  B_1   40
# 2  A_2  B_1  -80
# 3  A_3  B_1 -160
# 4  A_1  B_2  220
# 5  A_2  B_2  100
# 6  A_3  B_2   20
# 7  A_1  B_3  350
# 8  A_2  B_3  230
# 9  A_3  B_3  150

(和子集)。

相关内容

  • 没有找到相关文章

最新更新