анализ имен столбцов при объединении data.tables - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно объединить информацию столбца h фрейма данных Y в фрейм данных 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

Создано 2020-08-03 пакетом REPEX (v0.3.0)

Проблема, однако, в том, что имена столбцов, которые я использую для объединения, различаются в зависимости от информации, хранящейся где-то еще. Итак, предположим, что имя столбца c1 в X хранится в var, скажем var <- "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)

Однако мне интересно, есть ли лучший способ сделать это программно.

Я проверил все эти ссылки , но не смог найти решение, которое подойдет мне .

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 11 августа 2020

Спасибо @ 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

Создано 11.08.2020 с помощью пакета REPEX (v0.3.0)

...