Поиск внутреннего значения в датированном R - PullRequest
0 голосов
/ 17 марта 2020

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

dt <- data.table(id=LETTERS[1:8], id_opposite=c("B","A","H","D", "F","C", "E","G"), value = 1:8)
dt
   id id_opposite value
1:  A           B     1
2:  B           A     2
3:  C           H     3
4:  D           D     4
5:  E           F     5
6:  F           C     6
7:  G           E     7
8:  H           G     8

Я хочу добавить столбец, содержащий значение, соответствующее id_opposite. Таким образом, для первой строки это будет 2, а для второй строки это будет 1. ie Мой желаемый вывод такой:

  id id_opposite value value_opposite
1  A           B     1              2
2  B           A     2              1
3  C           H     3              8
4  D           D     4              4
5  E           F     5              6
6  F           C     6              3
7  G           E     7              5
8  H           G     8              7

Я знаю, что могу сделать это путем построения таблицы поиска из dt, а затем объединить его с dt, но есть ли способ сделать это в datatable, что-то вроде

dt[, value_opposite := dt[some-function-of-id_opposite-and-value]]

Спасибо, если у вас есть предложения!

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Простое самостоятельное соединение:

dt[dt, value_opposite := i.value, on = .(id_opposite = id)]
1 голос
/ 17 марта 2020

Для этого конкретного случая:

dt$value_opposite <- match(dt$id_opposite, dt$id)

Но если ваши значения отличаются от индексов, вы можете также сделать:

dt$value_opposite <- dt$value[match(dt$id_opposite, dt$id)]
dt
   id id_opposite value value_opposite
1:  A           B     1              2
2:  B           A     2              1
3:  C           H     3              8
4:  D           D     4              4
5:  E           F     5              6
6:  F           C     6              3
7:  G           E     7              5
8:  H           G     8              7
0 голосов
/ 17 марта 2020

Мне нравится использовать пакет dplyr, потому что я думаю, что он использует более интуитивный и читаемый синтаксис.

library(dplyr)
dt <- data.frame(id=LETTERS[1:8], id_opposite=c("B","A","H","D", "F","C", "E","G"), value = 1:8)

# Simpler solution
dt %>%
  inner_join(dt, by = c("id_opposite" = "id")) %>%
  select(id, id_opposite, value = value.x, opposite_value = value.y) %>%
  print(row.names = F)

# Alternative solution    
dt %>%
  inner_join(select(dt, id, value_opposite=value), by = c("id_opposite" = "id")) %>%
  print(row.names = F)

Вывод

 id id_opposite value value_opposite
  A           B     1              2
  B           A     2              1
  C           H     3              8
  D           D     4              4
  E           F     5              6
  F           C     6              3
  G           E     7              5
  H           G     8              7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...