Предотвращение дублирования столбцов при объединении с data.table - PullRequest
0 голосов
/ 01 января 2019

У меня есть две таблицы данных, которые имеют частично похожие имена столбцов:

   dfA <- read.table(
  text = "A   B   C   D   E   F   G   iso   year   matchcode
  1   0   1   1   1   0   1   0   NLD   2010   NLD2010
  2   1   0   0   0   1   0   1   NLD   2014   NLD2014
  3   0   0   0   1   1   0   0   AUS   2010   AUS2010
  4   1   0   1   0   0   1   0   AUS   2006   AUS2006
  5   0   1   0   1   0   1   1   USA   2008   USA2008
  6   0   0   1   0   0   0   1   USA   2010   USA2010
  7   0   1   0   1   0   0   0   USA   2012   USA2012
  8   1   0   1   0   0   1   0   BLG   2008   BLG2008
  9   0   1   0   1   1   0   1   BEL   2008   BEL2008
  10   1   0   1   0   0   1   0  BEL   2010   BEL2010",
  header = TRUE
)

   dfB <- read.table(
  text = "A   B   C   D   H   I   J   iso   year   matchcode
  1   0   1   1   1   0   1   0   NLD   2009   NLD2009
  2   1   0   0   0   1   0   1   NLD   2014   NLD2014
  3   0   0   0   1   1   0   0   AUS   2011   AUS2011
  4   1   0   1   0   0   1   0   AUS   2007   AUS2007
  5   0   1   0   1   0   1   1   USA   2007   USA2007
  6   0   0   1   0   0   0   1   USA   2011   USA2010
  7   0   1   0   1   0   0   0   USA   2013   USA2013
  8   1   0   1   0   0   1   0   BLG   2007   BLG2007
  9   0   1   0   1   1   0   1   BEL   2009   BEL2009
  10   1   0   1   0   0   1   0  BEL   2012   BEL2012",
  header = TRUE
)
library(data.table)
setDT(dfA)
setDT(dfB)

Чтобы объединить таблицы данных.Я сделаю следующее:

dfA <- dfA[dfB, on = .(iso, year), roll = "nearest", nomatch = 0]

Это, однако, за исключениемиз желаемого дубликата столбца matchcode также создайте ненужные дубликаты столбцов A, B, C, D.Из-за количества слияний, которое мне нужно сделать, это станет слишком запутанным.

Есть ли способ исключить дублирующиеся столбцы из процесса слияния без явной ссылки на них?Если нет, то как я могу сделать это, явно ссылаясь на них.Если нет, могу ли я удалить их впоследствии без явной ссылки на дубликаты?Например, удалив все столбцы, которые выглядят как `i.columnname '?

Предпочтительный вывод будет следующим:

#    A B C D E F G iso year matchcodeA H I J matchcodeB
# 1: 1 0 0 0 1 0 1 NLD  2014  NLD2014  1 0 1    NLD2014
# 2: 0 0 0 1 1 0 0 AUS  2011  AUS2010  1 0 0    AUS2011
# 3: 1 0 1 0 0 1 0 AUS  2007  AUS2006  0 1 0    AUS2007
# 4: 0 0 1 0 0 0 1 USA  2011  USA2010  0 0 1    USA2010
# 5: 0 1 0 1 0 0 0 USA  2013  USA2012  0 0 0    USA2013
# 6: 0 1 0 1 1 0 1 BEL  2009  BEL2008  1 0 1    BEL2009
# 7: 0 1 1 1 0 1 0 NLD  2009  NLD2010  0 1 0    NLD2009
# 8: 0 1 0 1 0 1 1 USA  2007  USA2008  0 1 1    USA2007
# 9: 0 1 0 1 0 0 0 USA  2011  USA2012  0 0 1    USA2010
#10: 1 0 1 0 0 1 0 BEL  2009  BEL2010  1 0 1    BEL2009

1 Ответ

0 голосов
/ 01 января 2019

Мы можем создать индекс имен столбцов, которые являются общими с intersecgt

nm1 <- intersect(names(dfA), names(dfB))

, затем, используя setdiff, найти имена столбцов, которые находятся в «dfB», а не в «nm1 ', включая объединяющие столбцы' iso '' year ', а также' matchcode '

nm2 <- c(setdiff(names(dfB), nm1), "iso", "year", "matchcode")

Теперь мы выполняем объединение

out <- dfA[dfB[, ..nm2], on = .(iso, year), roll = "nearest", nomatch = 0]
setnames(out, c('matchcode', 'i.matchcode'), c('matchcodeA', 'matchcodeB'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...