我有两个形式为
的数据帧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
(和子集)。