我有一個這樣的字典表:
| ID | 位置 | 地區 |
|---|---|---|
| 一個 | 1-50 | D1a |
| 一個 | 80-100 | D2a |
| 一個 | 250-300 | D3a |
| b | 50-100 | D1b |
| b | 150-180 | D2b |
| C | 1-20 | D1c |
| C | 50-80 | D2c |
| C | 100-200 | D3c |
| C | 250-300 | D4c |
和這樣的目標表:
| ID | 位置 |
|---|---|
| 一個 | 28 |
| 一個 | 85 |
| 一個 | 320 |
| b | 55 |
| b | 100 |
| C | 18 |
| C | 45 |
| C | 180 |
| C | 270 |
其邏輯是檢查目標表中的數值-Position是否在字典表中的位置范圍內,并輸出給定??ID的區域值。
我首先認為 R 包hash應該可以作業。但后來我發現哈希鍵必須是唯一的,在我的情況下不是。
如何首先匹配每個 ID,然后使用if between()或其他功能將我的目標映射到各自的區域?
uj5u.com熱心網友回復:
也許像這樣使用整潔的詩歌方法(tidyr::separate)
但是,這是一個快速的答案,我不確定是否能如您所愿地理解您的資料關系。
library(tidyverse)
one <- tibble::tribble(
~ID, ~Position, ~Region,
"a", "1-50", "D1a",
"a", "80-100", "D2a",
"a", "250-300", "D3a",
"b", "50-100", "D1b",
"b", "150-180", "D2b",
"c", "1-20", "D1c",
"c", "50-80", "D2c",
"c", "100-200", "D3c",
"c", "250-300", "D4c"
)
two <- tibble::tribble(
~ID, ~Position,
"a", 28L,
"a", 85L,
"a", 320L,
"b", 55L,
"b", 100L,
"c", 18L,
"c", 45L,
"c", 180L,
"c", 270L
)
one_ <- one %>%
tidyr::separate(Position, c('p_min', 'p_max'), sep = "-") %>%
mutate_at(vars(starts_with('p_')), as.integer)
two %>%
mutate(rn = row_number()) %>%
left_join(one_) %>%
mutate(in_between = (Position >= p_min & Position <= p_max)) %>%
filter(in_between) %>%
distinct(rn, .keep_all = TRUE)
Joining, by = "ID"
# A tibble: 7 × 7
ID Position rn p_min p_max Region in_between
<chr> <int> <int> <int> <int> <chr> <lgl>
1 a 28 1 1 50 D1a TRUE
2 a 85 2 80 100 D2a TRUE
3 b 55 4 50 100 D1b TRUE
4 b 100 5 50 100 D1b TRUE
5 c 18 6 1 20 D1c TRUE
6 c 180 8 100 200 D3c TRUE
7 c 270 9 250 300 D4c TRUE
uj5u.com熱心網友回復:
這是你預期的結果嗎?
library(data.table)
dt1 <- fread("
ID Position Region
a 1-50 D1a
a 80-100 D2a
a 250-300 D3a
b 50-100 D1b
b 150-180 D2b
c 1-20 D1c
c 50-80 D2c
c 100-200 D3c
c 250-300 D4c
")
dt2 <- fread("
ID Position
a 28
a 85
a 320
b 55
b 100
c 18
c 45
c 180
c 270
")
#dt1[,c("Position_left","Position_right") := tstrsplit(Position,"-")]
#dt1[, dt2$Position
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419374.html
標籤:
