【问题标题】:parsing column names when joining data.tables加入 data.tables 时解析列名
【发布时间】:2020-11-23 18:27:28
【问题描述】:

我需要将数据框Y的列h的信息加入数据框X。下面的代码显示了所需的输出。

library(data.table)
X <- data.table(
  a1 = rep("A", 6), 
  b1 = rep(1,6), 
  c1 = rep(c(0,1), 1, each = 3),
  d = letters[1:6]
)

Y <- data.table(
  a2 = rep(c("A","B", "C"), 1, each = 2),
  b2 = rep(c(1, 2, 3), 1, each = 2),
  c2 = rep(c(0,1), 3),
  h = letters[7:12]
)


# final result

X[Y,
  on = .(a1 = a2, 
         b1 = b2, 
         c1 = c2),
  h := i.h
  ][]
#>    a1 b1 c1 d h
#> 1:  A  1  0 a g
#> 2:  A  1  0 b g
#> 3:  A  1  0 c g
#> 4:  A  1  1 d h
#> 5:  A  1  1 e h
#> 6:  A  1  1 f h

reprex package (v0.3.0) 于 2020 年 8 月 3 日创建

然而,问题是我用于连接的列的名称会因存储在其他地方的信息而异。因此,我们假设X 中的列c1 的名称存储在var 中,比如var &lt;- "c2"。现在,当我尝试加入时,似乎没有任何效果。

# None the attempts below works
var <- "c1"

# attempt 1
X[Y,
  on = .(a1 = a2, 
         b1 = b2, 
         eval(var) = c2),
  h := i.h
][]

# attempt 2
X[Y,
  on = .(a1 = a2, 
         b1 = b2, 
         get(var) = c2),
  h := i.h
][]

# attempt 3
cond    <- paste0(deparse(var), " = c2")
parcond <- parse(text = cond)

X[Y,
  on = .(a1 = a2, 
         b1 = b2, 
         eval(parcond)),
  h := i.h
][]

最后,我发现解决它的唯一方法非常不优雅,但它似乎有效。

var <- "c1"
setnames(X, var, "c2")

X[Y,
  on = c("a1" = "a2", 
         "b1" = "b2", 
         "c2"),
  h := i.h
][]

setnames(X, "c2", var)

但是,我想知道是否有更好的方式以编程方式执行此操作。

我检查了所有these links,但找不到适合我的解决方案。

非常感谢您的帮助。

【问题讨论】:

  • 嗨,您可以将 on 构造为 char 向量并将其传入。例如onkey &lt;- c("a1=a2", "b1=b2", paste0(deparse(var),"=c2")); X[Y, on=onkey, h := i.h]
  • 感谢您的评论@chinsoon12。不幸的是,它没有用。我收到以下错误:Error in colnamesInt(x, names(on), check_dups = FALSE) : argument specifying columns specify non existing column(s): cols[1]='a1=a2'
  • 对不起,它应该是双等号,即onkey &lt;- c("a1==a2", "b1==b2", paste0(var,"==c2")); X[Y, on=onkey, h := i.h]
  • 亲爱的@chinsoon12,这个解决方案效果很好!太感谢了。您是否应该创建一个答案以便我确认其为有效答案?
  • 请随时回答

标签: r join data.table


【解决方案1】:

感谢@chinsoon12 的评论,问题的解决方案如下,

library(data.table)
X <- data.table(
  a1 = rep("A", 6), 
  b1 = rep(1,6), 
  c1 = rep(c(0,1), 1, each = 3),
  d = letters[1:6]
  )

Y <- data.table(
  a2 = rep(c("A","B", "C"), 1, each = 2),
  b2 = rep(c(1, 2, 3), 1, each = 2),
  c2 = rep(c(0,1), 3),
  h = letters[7:12]
  )


var <- "c1"

onkey <- c("a1==a2", "b1==b2",  paste0(var,"==c2"))

X[Y, 
  on=onkey, 
  h := i.h
  ][]
#>    a1 b1 c1 d h
#> 1:  A  1  0 a g
#> 2:  A  1  0 b g
#> 3:  A  1  0 c g
#> 4:  A  1  1 d h
#> 5:  A  1  1 e h
#> 6:  A  1  1 f h

reprex package (v0.3.0) 于 2020-08-11 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2012-12-13
    • 2014-06-21
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多