内连接,看不到列

Inner join, can't see the column

我有以下两个数据集:

t_d <- setDT(structure(list(i_phase = c(1L, 1L, 1L, 1L, 1L, 1L, -1L, -1L, 
-1L, -1L, -1L, -1L), Time = c(4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001), SimulationID = c(4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), N = c(40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L), discountFactor = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), AgentID = c(4L, 5L, 4L, 5L, 
4L, 5L, 1L, 2L, 3L, 1L, 2L, 3L), State = c(1L, 11L, 1L, 11L, 
1L, 11L, 15L, 4L, 9L, 15L, 4L, 9L), displacement = c(1, -1, 1, 
-1, 1, -1, -5, 0, -17, -5, 0, -17), aAgentID = c(1L, 1L, 2L, 
2L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), aState = c(15L, 15L, 4L, 
4L, 9L, 9L, 1L, 1L, 1L, 11L, 11L, 11L), adisplacement = c(-5, 
-5, 0, 0, -17, -17, 1, 1, 1, -1, -1, -1)), row.names = c(NA, 
-12L), class = c("data.table", "data.frame")))

dStat <- setDT(structure(list(Time = c(4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001), AgentID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), SimulationID = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L), N = c(40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L), 
    discountFactor = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), position = c(0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)), row.names = c(NA, 
-85L), class = c("data.table", "data.frame")))

我想做的是:

  dStat[t_d, vDensity_againts:= mean(i.adisplacement), on=.(position=aState,AgentID = AgentID,Time,SimulationID,N,discountFactor), by=.(position,AgentID,Time,SimulationID,N,discountFactor)]

然而,它给了我

> object 'i.adisplacement' not found

我不明白,t_d data.table 有一个列名称 adisplacement 如果我删除 vDensity_againts:= mean(i.adisplacement),我可以看到加入的 data.table也有一个列adisplacement,但是当我想做一个像vDensity_againts:= mean(i.adisplacement)这样的赋值时,它看不到那个列。

为什么会这样?


附录:

理想的输出代码应该是这样的

setDT(structure(list(Time = c(4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 
4001), AgentID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), SimulationID = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L), N = c(40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L), 
    discountFactor = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), position = c(0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), vDensity_againts = c(0, 
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, -17, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, -17, 0, 0, 0, 0, 0, -5, 0)), row.names = c(NA, -85L), class = c("data.table", 
"data.frame"), index = structure(integer(0), "`__AgentID`" = integer(0))))

略有不同的代码,首先聚合,其次连接:

results <- t_d[, .(vDensity_againts=mean(adisplacement)), by=.(Time, AgentID, SimulationID, N, discountFactor, aState)
    ][ dStat, on=.(Time, AgentID, SimulationID, N, discountFactor, aState == position)
      ][, vDensity_againts := fcoalesce(vDensity_againts, 0)]

results
#      Time AgentID SimulationID     N discountFactor aState vDensity_againts
#     <num>   <int>        <int> <int>          <num>  <int>            <num>
#  1:  4001       1            4    40              0      0                0
#  2:  4001       1            4    40              0      1                1
#  3:  4001       1            4    40              0      2                0
#  4:  4001       1            4    40              0      3                0
#  5:  4001       1            4    40              0      4                0
#  6:  4001       1            4    40              0      5                0
#  7:  4001       1            4    40              0      6                0
#  8:  4001       1            4    40              0      7                0
#  9:  4001       1            4    40              0      8                0
# 10:  4001       1            4    40              0      9                0
# 11:  4001       1            4    40              0     10                0
# 12:  4001       1            4    40              0     11               -1
# 13:  4001       1            4    40              0     12                0
# 14:  4001       1            4    40              0     13                0
# 15:  4001       1            4    40              0     14                0
# 16:  4001       1            4    40              0     15                0
# 17:  4001       1            4    40              0     16                0
# 18:  4001       2            4    40              0      0                0
# 19:  4001       2            4    40              0      1                1
# 20:  4001       2            4    40              0      2                0
# 21:  4001       2            4    40              0      3                0
# 22:  4001       2            4    40              0      4                0
# 23:  4001       2            4    40              0      5                0
# 24:  4001       2            4    40              0      6                0
# 25:  4001       2            4    40              0      7                0
# 26:  4001       2            4    40              0      8                0
# 27:  4001       2            4    40              0      9                0
# 28:  4001       2            4    40              0     10                0
# 29:  4001       2            4    40              0     11               -1
# 30:  4001       2            4    40              0     12                0
# 31:  4001       2            4    40              0     13                0
# 32:  4001       2            4    40              0     14                0
# 33:  4001       2            4    40              0     15                0
# 34:  4001       2            4    40              0     16                0
# 35:  4001       3            4    40              0      0                0
# 36:  4001       3            4    40              0      1                1
# 37:  4001       3            4    40              0      2                0
# 38:  4001       3            4    40              0      3                0
# 39:  4001       3            4    40              0      4                0
# 40:  4001       3            4    40              0      5                0
# 41:  4001       3            4    40              0      6                0
# 42:  4001       3            4    40              0      7                0
# 43:  4001       3            4    40              0      8                0
# 44:  4001       3            4    40              0      9                0
# 45:  4001       3            4    40              0     10                0
# 46:  4001       3            4    40              0     11               -1
# 47:  4001       3            4    40              0     12                0
# 48:  4001       3            4    40              0     13                0
# 49:  4001       3            4    40              0     14                0
# 50:  4001       3            4    40              0     15                0
# 51:  4001       3            4    40              0     16                0
# 52:  4001       4            4    40              0      0                0
# 53:  4001       4            4    40              0      1                0
# 54:  4001       4            4    40              0      2                0
# 55:  4001       4            4    40              0      3                0
# 56:  4001       4            4    40              0      4                0
# 57:  4001       4            4    40              0      5                0
# 58:  4001       4            4    40              0      6                0
# 59:  4001       4            4    40              0      7                0
# 60:  4001       4            4    40              0      8                0
# 61:  4001       4            4    40              0      9              -17
# 62:  4001       4            4    40              0     10                0
# 63:  4001       4            4    40              0     11                0
# 64:  4001       4            4    40              0     12                0
# 65:  4001       4            4    40              0     13                0
# 66:  4001       4            4    40              0     14                0
# 67:  4001       4            4    40              0     15               -5
# 68:  4001       4            4    40              0     16                0
# 69:  4001       5            4    40              0      0                0
# 70:  4001       5            4    40              0      1                0
# 71:  4001       5            4    40              0      2                0
# 72:  4001       5            4    40              0      3                0
# 73:  4001       5            4    40              0      4                0
# 74:  4001       5            4    40              0      5                0
# 75:  4001       5            4    40              0      6                0
# 76:  4001       5            4    40              0      7                0
# 77:  4001       5            4    40              0      8                0
# 78:  4001       5            4    40              0      9              -17
# 79:  4001       5            4    40              0     10                0
# 80:  4001       5            4    40              0     11                0
# 81:  4001       5            4    40              0     12                0
# 82:  4001       5            4    40              0     13                0
# 83:  4001       5            4    40              0     14                0
# 84:  4001       5            4    40              0     15               -5
# 85:  4001       5            4    40              0     16                0
#      Time AgentID SimulationID     N discountFactor aState vDensity_againts

除了名称从 position 更改为 aState(很容易),这与您的预期输出相同:

Map(all.equal, results, expected)
# $Time
# [1] TRUE
# $AgentID
# [1] TRUE
# $SimulationID
# [1] TRUE
# $N
# [1] TRUE
# $discountFactor
# [1] TRUE
# $aState
# [1] TRUE
# $vDensity_againts
# [1] TRUE