【问题标题】:Merge data.tables while keeping original order in R合并data.tables,同时保持R中的原始顺序
【发布时间】:2020-05-25 00:41:20
【问题描述】:

我想合并两个数据表,同时保持数据表的原始顺序。我还想有一个最后一栏来说明这两个 id 是否相互匹配。所有这些同时保持 data.table 的原始顺序。

测试 data.table 显示我遇到的问题,当您合并两个 data.tables 时,行的顺序有时会不同。

如果(g1.label==g2.label) 那么(match=="T")

library(data.table)

set.seed(100)

dt <- data.table(g1=c("A", "B", "C", "D", "E", "F", "L", "O", "P", "J"), 
                 g2=c("G", "D", "C", "H", "K", "J", "L", "U", "I", "R"),
                 value= rnorm(10))

ids <- data.table(labels=c("A", "B", "C", "D", "E", "F", "L", "O", 
                           "P", "J", "G", "H", "K", "U", "I", "R"),
                  ids=c(1:16))

test <- merge(dt, ids, by.x="g1", by.y="labels")
test2 <- merge(dt, ids, by.x="g2", by.y="labels")

# Desired output with original order
g1 g2 value g1.label g2.label match
A  G -0.50219235 1  11 F
B  D  0.13153117 2  4  F
C  C -0.07891709 3  3  T
D  H  0.88678481 4  12 F
E  K  0.86014084 5  13 F
F  J  1.09086728 6  10 F
L  L  1.42053190 7  7  T
O  U  0.93415334 8  14 F
P  I  0.22375495 9  15 F
J  R -0.35749574 10 16 F

【问题讨论】:

    标签: r merge data.table


    【解决方案1】:

    一种选择是将sort=FALSE 传入merge

    test <- merge(dt, ids, by.x="g1", by.y="labels", sort=FALSE)
    test2 <- merge(test, ids, by.x="g2", by.y="labels", sort=FALSE)
    test2[, match := ids.x==ids.y]
    

    另一种选择是使用更新连接:

    dt[ids, on=c("g1"="labels"), ids.x := ids]
    dt[ids, on=c("g2"="labels"), ids.y := ids]
    dt[, match := ids.x==ids.y]
    

    test2的输出:

        g2 g1       value ids.x ids.y match
     1:  G  A -0.50219235     1    11 FALSE
     2:  D  B  0.13153117     2     4 FALSE
     3:  C  C -0.07891709     3     3  TRUE
     4:  H  D  0.88678481     4    12 FALSE
     5:  K  E  0.11697127     5    13 FALSE
     6:  J  F  0.31863009     6    10 FALSE
     7:  L  L -0.58179068     7     7  TRUE
     8:  U  O  0.71453271     8    14 FALSE
     9:  I  P -0.82525943     9    15 FALSE
    10:  R  J -0.35986213    10    16 FALSE
    

    【讨论】:

      【解决方案2】:

      使用dplyr的解决方案:

      library(data.table)
      
      set.seed(100)
      
      dt <- data.table(g1=c("A", "B", "C", "D", "E", "F", "L", "O", "P", "J"), 
                       g2=c("G", "D", "C", "H", "K", "J", "L", "U", "I", "R"),
                       value= rnorm(10))
      
      ids <- data.table(labels=c("A", "B", "C", "D", "E", "F", "L", "O", 
                                 "P", "J", "G", "H", "K", "U", "I", "R"),
                        ids=c(1:16))
      
      dt %>% 
        left_join(ids, by= c("g1"="labels")) %>% 
        mutate(label_match = g1 == g2)
      

      返回:

          g1 g2      value ids label_match
      1   A  G -0.50219235   1       FALSE
      2   B  D  0.13153117   2       FALSE
      3   C  C -0.07891709   3        TRUE
      4   D  H  0.88678481   4       FALSE
      5   E  K  0.11697127   5       FALSE
      6   F  J  0.31863009   6       FALSE
      7   L  L -0.58179068   7        TRUE
      8   O  U  0.71453271   8       FALSE
      9   P  I -0.82525943   9       FALSE
      10  J  R -0.35986213  10       FALSE
      

      【讨论】:

      • 如何为 g1 和 g2 添加 id?所以你会有一个 ids.g1 和一个 ids.g2。
      • 很抱歉,我不明白您的问题:g1g2 都是生成的 data.frame 中的两个变量。另一方面,名为ids 的data.tabel 没有名为g1g2 的列...抱歉,如果我遗漏了什么,请纠正我...
      • dt % left_join(ids, by= c("g1"="labels")) %>% left_join(ids, by= c("g2" = "labels" )) %>% 变异(label_match = ids.x == ids.y)
      • 我从您的代码中提取了我最初的问题,谢谢!现在让我知道这是否有意义。
      猜你喜欢
      • 2013-07-26
      • 2016-11-19
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多