Я думаю, что это прямое соединение из нескольких столбцов:
library(dplyr)
t2 %>%
left_join(transmute(t1, CTY=Cty, STATE, Index=1L), by=c("CTY", "STATE")) %>%
mutate(Index = if_else(is.na(Index), 0L, Index))
# STATE CTY CRP Pol_No Plan Price Index
# 1 AL 1 11 150410 90 4563 0
# 2 AL 1 21 45023 90 5402 0
# 3 MO 143 11 85010 90 2522 1
РЕДАКТИРОВАТЬ
Я пытался выучить data.table
, подумалЯ бы попробовал.Мне кажется, немного неуклюже, я уверен, что есть способ упростить его.
t1 <- setDT(t1); t2 <- setDT(t2)
Для удобства установите имена столбцов одинаковыми (яв противном случае я не уверен, как легко это сделать) ... один - "Cty"
, другой - "CTY"
.Сделайте их одинаковыми.
colnames(t1)[2] <- "CTY"
Теперь, объединение.
t1[,.(CTY,STATE,CRP,Index=1),][t2,on=c("CTY","STATE","CRP")]
# CTY STATE CRP Index Pol_No Plan Price
# 1: 1 AL 11 NA 150410 90 4563
# 2: 1 AL 21 NA 45023 90 5402
# 3: 143 MO 11 1 85010 90 2522
Примечания:
- первая скобочная операция выбирает только три соединениястолбцы и назначение четвертого,
Index
; - , фактическое объединение во втором брекет-операторе, первое - просто выделение
- , обычно
data.table
ops работают с побочным эффектом,но не слияния или выборки, подобные этому, поэтому он возвращает их без изменения базовой структуры;для этого нам нужно сохранить его (возможно, в t2
)
Это близко ... теперь просто обновите поле Index
, так как оно либо 1
, гдеданные сосуществуют или NA
в противном случае.
t2 <- t1[,.(CTY,STATE,CRP,Index=1),][t2,on=c("CTY","STATE","CRP")]
t2[,Index := as.integer(!is.na(Index)),]
t2
# CTY STATE CRP Index Pol_No Plan Price
# 1: 1 AL 11 0 150410 90 4563
# 2: 1 AL 21 0 45023 90 5402
# 3: 143 MO 11 1 85010 90 2522
Данные:
t1 <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Pol Cty Avg STATE CRP
85010 23 1123 MO 11
75022 23 1123 MO 11
35014 143 450 MO 11')
t2 <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
STATE CTY CRP Pol_No Plan Price
AL 1 11 150410 90 4563
AL 1 21 45023 90 5402
MO 143 11 85010 90 2522')