Выберите, из какого столбца я получаю результаты в соединении data.table — R

#r #data.table

Вопрос:

Я хотел бы выбрать столбец, из которого я хочу получать результаты, передав его в соединении.

Мои данные имеют следующий формат:

 tab1 = data.table(z = c(1,2,3,4),
                  x = c("A", "B", "C", "D"),
                  y = c("E", "F", "G", "H"))

tab2 = data.table(z = c(1,2,3,4),
                  column = c("x", "x", "y", "y"))
 

Я пробовал следующие решения, и они не работают:

 # solutions that dont work
tab2[, val := tab1[tab2, on = .(z), get(i.column)]]
tab2[, val := tab1[tab2, on = .(z), column, with=F]]
 

Я пытаюсь присоединиться tab2 tab1 и вернуть результаты либо из столбца x , либо y в зависимости от того, что оценивается из column поля.

Результаты должны выглядеть так:

 | z | column | val |
--------------------
| 1 | x      | A   |
| 2 | x      | B   |
| 3 | y      | G   |
| 4 | y      | H   |
 

Большое спасибо

Ответ №1:

Нам нужен by аргумент

 tab2[tab1, val := get(column), on = .(z), by = .EACHI]
 

-выход

 > tab2
   z column val
1: 1      x   A
2: 2      x   B
3: 3      y   G
4: 4      y   H
 

Комментарии:

1. есть ли способ добавить условие в этот запрос? в частности, там, где tab2 column нет NA ?

2. @Laurence_jj можете ли вы показать пример и ожидаемые

Ответ №2:

Вот ответ в стиле SQL, который требует изменения tab2 формата с широкого на длинный. Затем имена столбцов становятся элементами данных.

 tab2[, val := melt(tab1, id.var = "z")[tab2, on = .(z, variable = column), value]]
tab2
 
    z column val
1: 1      x   A
2: 2      x   B
3: 3      y   G
4: 4      y   H