【问题标题】:Unable to reproduce expected result of tableB[ tableA]无法重现 tableB[tableA] 的预期结果
【发布时间】:2019-06-25 12:02:57
【问题描述】:

我无法在我的数据上使用 tableB[tableA] 产生预期的结果。但同样适用于简单的示例数据。请解码我做错了什么。


> tableA <- data.table(col1 = c( 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6,        1.7, 1.8, 1.9), key = 'col1')

> tableA
    col1
 1:  1.0
 2:  1.1
 3:  1.2
 4:  1.3
 5:  1.4
 6:  1.5
 7:  1.6
 8:  1.7
 9:  1.8
10:  1.9

> tableB <- data.table(col1 = c( 1.0, 1.2, 1.5, 1.9), col2 = c( "A", "B", "C", "D"), col3 = c( "AA", "BB", "CC", "DD"), key = 'col1')

> tableB
   col1 col2 col3
1:  1.0    A   AA
2:  1.2    B   BB
3:  1.5    C   CC
4:  1.9    D   DD

> tableA <- tableB[ tableA]

> tableA
    col1 col2 col3
 1:  1.0    A   AA
 2:  1.1 <NA> <NA>
 3:  1.2    B   BB
 4:  1.3 <NA> <NA>
 5:  1.4 <NA> <NA>
 6:  1.5    C   CC
 7:  1.6 <NA> <NA>
 8:  1.7 <NA> <NA>
 9:  1.8 <NA> <NA>
10:  1.9    D   DD

这是预期的。但是..

> tableA <- data.table( V1 = seq( 1, by = 0.1, length.out = 20), key = 'V1')

> tableA
     V1
 1: 1.0
 2: 1.1
 3: 1.2
 4: 1.3
 5: 1.4
 6: 1.5
 7: 1.6
 8: 1.7
 9: 1.8
10: 1.9
11: 2.0
12: 2.1
13: 2.2
14: 2.3
15: 2.4
16: 2.5
17: 2.6
18: 2.7
19: 2.8
20: 2.9

> tableB <- fread( file = "C:/Users/Vj/Desktop/data backup/ch1.csv", header = FALSE, sep = ",", key = 'V1')

> tableB
     V1      V2      V3
 1: 1.0 0.90812 1.17372
 2: 1.1 0.91312 1.16307
 3: 1.2 0.91783 1.16928
 4: 1.3 0.93506 1.16695
 5: 1.5 0.91891 1.16016
 6: 1.6 0.90138 1.17475
 7: 1.7 0.90008 1.17295
 8: 1.9 0.90542 1.14948
 9: 2.0 0.91563 1.16735
10: 2.2 0.91167 1.16976
11: 2.3 0.90378 1.17025
12: 2.4 0.90938 1.17165
13: 2.5 0.88599 1.17586
14: 2.6 0.90107 1.18052
15: 2.7 0.90451 1.14228
16: 2.9 0.90673 1.16695

> tableA <- tableB[ tableA]

> tableA
     V1      V2      V3
 1: 1.0 0.90812 1.17372
 2: 1.1 0.91312 1.16307
 3: 1.2 0.91783 1.16928
 4: 1.3 0.93506 1.16695
 5: 1.4      NA      NA
 6: 1.5 0.91891 1.16016
 7: 1.6 0.90138 1.17475
 8: 1.7      NA      NA
 9: 1.8      NA      NA
10: 1.9 0.90542 1.14948
11: 2.0 0.91563 1.16735
12: 2.1      NA      NA
13: 2.2 0.91167 1.16976
14: 2.3 0.90378 1.17025
15: 2.4      NA      NA
16: 2.5 0.88599 1.17586
17: 2.6 0.90107 1.18052
18: 2.7 0.90451 1.14228
19: 2.8      NA      NA
20: 2.9      NA      NA

这不是任何“错字”。我可以一次又一次地重现相同的确切结果。 任何见解都会很有价值。

没有错误。我预计有 16 行有效行和 4 行 NA。但是,我只得到 13 行有效行和 7 行 NA。

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    这是由于 V1 中的十进制值存在浮点错误。这不是 R(或 data.table)问题,而是计算机处理十进制数的方式。
    阅读此内容:Why are these numbers not equal? 了解更多信息。

    为了防止这样的“错误”,解决方案是将连接列设置为字符。

    tableA[, V1 := as.character(V1)]
    tableB[, V1 := as.character(V1)]
    
    tableB[tableA, on = .(V1)]
    

    会给出预期的结果

         V1      V2      V3
     1:   1 0.90812 1.17372
     2: 1.1 0.91312 1.16307
     3: 1.2 0.91783 1.16928
     4: 1.3 0.93506 1.16695
     5: 1.4      NA      NA
     6: 1.5 0.91891 1.16016
     7: 1.6 0.90138 1.17475
     8: 1.7 0.90008 1.17295
     9: 1.8      NA      NA
    10: 1.9 0.90542 1.14948
    11:   2 0.91563 1.16735
    12: 2.1      NA      NA
    13: 2.2 0.91167 1.16976
    14: 2.3 0.90378 1.17025
    15: 2.4 0.90938 1.17165
    16: 2.5 0.88599 1.17586
    17: 2.6 0.90107 1.18052
    18: 2.7 0.90451 1.14228
    19: 2.8      NA      NA
    20: 2.9 0.90673 1.16695
    

    【讨论】:

    • VjSwamy:很高兴它成功了。如果给定的答案适合您的需要,您可以接受它作为答案。
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多