代码之家  ›  专栏  ›  技术社区  ›  philsf

在数据中操作。通过匹配第二个数据中的列来创建表列。桌子

  •  2
  • philsf  · 技术社区  · 7 年前

    我正在尝试执行 character 操作( paste )在从一开始的列中 data.table 使用秒数据 数据桌子

    由于我还在这段特定代码前后执行其他不相关的合并操作,因此行顺序可能会更改,因此我目前正在同时设置这两个行的顺序 前后 这种操纵。

    DT1 <- data.table(ID = c("a", "b", "c"), N = c(4,1,3)) # N used
    DT2 <- data.table(ID = c("b","a","c"), N = c(10,10, 15)) # N total
    
    # without merge
    DT1 <- DT1[order(ID)]
    DT2 <- DT2[order(ID)]
    DT1[, N := paste0(N, "/", DT2$N)]
    DT1
    # ID    N
    # 1:  a 4/10
    # 2:  b 1/10
    # 3:  c 3/15
    

    我知道一个 merge 两个DTs中的一个(根据定义)将负责匹配,但这会创建额外的列,我需要在以后删除这些列。

    # using merge
    DT1 <- merge(DT1, DT2, by = "ID")
    DT1[, N := paste0(N.x, "/", N.y)]
    DT1[, c("N.x", "N.y") := list(NULL, NULL)]
    
    DT1
    # ID    N
    # 1:  a 4/10
    # 2:  b 1/10
    # 3:  c 3/15
    

    有没有一种更聪明的方法 数据桌子 ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   akrun    7 年前

    我们可以使用 join 将“N”列转换为后 character

    DT1[DT2, N := paste0(N, "/", i.N), on = .(ID)]
    DT1
    #  ID    N
    #1:  a 4/10
    #2:  b 1/10
    #3:  c 3/15
    

    数据

    DT1 <- data.table(ID = c("a", "b", "c"), N = c(4,1,3))
    DT2 <- data.table(ID = c("b","a","c"), N = c(10,10, 15)) # N total
    DT1[, N:= as.character(N)]