#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