首页 > 解决方案 > 将合并的列的列名更改为指定数据集中的名称

问题描述

如果我有以下data.tables:

编辑:更改cdt1d防止dt1[dt2, on=.(col1= adapted_col1 )]成为问题的解决方案。

library(data.table)
dt1 <- data.table(col1 = c("a", "b", "d"), 
                  col2 = 1:3, 
                  col3 = c(TRUE, FALSE, FALSE))

set.seed(1)
dt2 <- data.table(adapted_col1 = sample(c("a", "b", "c"), size = 10, replace = TRUE), 
                  another_col = sample(1:10, size = 10, replace = TRUE), 
                  and_anouther = sample(c(TRUE, FALSE), size = 10, replace = TRUE))

我将它们合并如下:

dt2[dt1, on=.(adapted_col1 = col1)]

    adapted_col1 another_col and_anouther col2  col3
 1:            a           3        FALSE    1  TRUE
 2:            a           8         TRUE    1  TRUE
 3:            a           8         TRUE    1  TRUE
 4:            b           2         TRUE    2 FALSE
 5:            b           7        FALSE    2 FALSE
 6:            b          10         TRUE    2 FALSE
 7:            b           4        FALSE    2 FALSE
 8:            c           4         TRUE    3 FALSE
 9:            c           5         TRUE    3 FALSE
10:            c           8         TRUE    3 FALSE

该列在 中获取列名的名称dt2。但是,由于我将与 重复进行此合并dt1,因此我需要新的 data.table 具有来自 的列名dt1。我可以改变这个吗?

我发现的唯一解决方案是这篇使用不同包的帖子,但我宁愿只使用 data.table。

标签: rmergedata.table

解决方案


澄清后,我建议为此编写自己的函数:

correct_name_join <- function(dt1, dt2, ...){
  dots <- vapply(substitute(...()), deparse, NA_character_)
  dt <- dt1[dt2, on = dots]
  setnames(dt, old = names(dots), new = as.character(dots))
  return(dt)
}

correct_name_join(dt2, dt1, adapted_col1 = col1)
   col1 another_col and_anouther col2  col3
1:    a           3         TRUE    1  TRUE
2:    a           5         TRUE    1  TRUE
3:    a          10         TRUE    1  TRUE
4:    b           5        FALSE    2 FALSE
5:    b           7        FALSE    2 FALSE
6:    b           9        FALSE    2 FALSE
7:    d          NA           NA    3 FALSE

dt2[dt1, on=.(adapted_col1 = col1)]
   adapted_col1 another_col and_anouther col2  col3
1:            a           3         TRUE    1  TRUE
2:            a           5         TRUE    1  TRUE
3:            a          10         TRUE    1  TRUE
4:            b           5        FALSE    2 FALSE
5:            b           7        FALSE    2 FALSE
6:            b           9        FALSE    2 FALSE
7:            d          NA           NA    3 FALSE


推荐阅读