Data.frame преобразует данные с критериями из другого data.frame, например Excel, «таблица критериев» - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть data.frame df1 и data.frame df2. Как использовать df2 для преобразования / преобразования df1 в merged data.frame, где: столбец name будет заполнен значением df2$name, если df1 $ id> = df2 $ start и <= df2 $ end. </p>

df1 = data.frame(id = 1:10, c = letters[1:10])
df2 = data.frame(name = LETTERS[1:3], start = c(2, 5, 8), end = c(4,7, 9))
merged = data.frame(id = df1$id, c = df1$c, name = c(NA, "A", "A", "A", "B", "B", "B", "C", "C", NA) )

Визуально:

> df1
   id c
1   1 a
2   2 b
3   3 c
4   4 d
5   5 e
6   6 f
7   7 g
8   8 h
9   9 i
10 10 j
> df2
  name start end
1    A     2   4
2    B     5   7
3    C     8   9
> merged
   id c name
1   1 a <NA>
2   2 b    A
3   3 c    A
4   4 d    A
5   5 e    B
6   6 f    B
7   7 g    B
8   8 h    C
9   9 i    C
10 10 j <NA>

1 Ответ

2 голосов
/ 23 апреля 2020

Мы можем использовать non-equi соединение с data.table и назначить новый столбец с соответствующими значениями 'name', где выполняется условное объединение

library(data.table)
setDT(df1)[df2, cn := name, on = .(id > start, id <= end)]
df1
#    id c   cn
# 1:  1 a <NA>
# 2:  2 b <NA>
# 3:  3 c    A
# 4:  4 d    A
# 5:  5 e <NA>
# 6:  6 f    B
# 7:  7 g    B
# 8:  8 h <NA>
# 9:  9 i    C
#10: 10 j <NA>

Или другой вариант fuzzyjoin

library(fuzzyjoin)
library(dplyr)
fuzzy_left_join(df1, df2, by = c('id' = 'start', 'id' = 'end'), 
         match_fun = list(`>`, `<=`)) %>%
     select(id, c, cn = name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...