2016-08-24 9 views
0

У меня есть 2 кадра данных как этотОбновление столбца в df2 путем сопоставления шаблонов в столбцах в df1 и df2 с помощью R

TEAM <- c("PE","PE","MPI","TDT","HPT","ATD") 
CODE <- c(NA,"F","A","H","G","D") 
df1 <- data.frame(TEAM,CODE) 

CODE <- c(NA,"F100","A234","D664","H435","G123","A666","D345","G324",NA) 
TEAM <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA) 
df2 <- data.frame(CODE,TEAM) 

Я пытаюсь обновить команду в df2 сопоставляя первую букву в столбце кода в df1 с колонной кода в df2

Мой желаемый результат для df2

CODE TEAM 
1 NA PE 
2 F100 PE 
3 A234 MPI 
4 D664 ATD 
5 H435 TDT 
6 G123 HPT 
7 A666 MPI 
8 D345 ATD 
9 G324 HPT 
10 NA PE 

Я пытаюсь этот путь с sqldf, но это не так

library(sqldf) 
df2 <- sqldf(c("update df2 set TEAM = 
        case 
        when CODE like '%F%' then 'PE' 
        when CODE like '%A%' then 'MPI' 
        when CODE like '%D%' then 'ATD' 
        when CODE like '%G%' then 'HPT' 
        when CODE like '%H%' then 'TDT' 
        else 'NA' 
        end")) 

Может кто-нибудь помочь мне предоставить некоторые указания по достижению этого без sqldf?

ответ

2

Использование match и substr (как в базе R):

df2$TEAM = df1$TEAM[match(substr(df2$CODE, 1, 1), df1$CODE)] 

df2 
# CODE TEAM 
# 1 <NA> PE 
# 2 F100 PE 
# 3 A234 MPI 
# 4 D664 ATD 
# 5 H435 TDT 
# 6 G123 HPT 
# 7 A666 MPI 
# 8 D345 ATD 
# 9 G324 HPT 
# 10 <NA> PE 

Это целесообразно для одного случая - если вы делаете такие вещи, как это часто я призываю вас просто извлечь первую букву код в его собственный столбец, CODE_1, а затем сделать регулярный merge или присоединиться.

0

Предполагая, что вы ищете решение sqldf попробовать это:

sqldf("select CODE, 
       case 
       when CODE like 'F%' then 'PE' 
       when CODE like 'A%' then 'MPI' 
       when CODE like 'D%' then 'ATD' 
       when CODE like 'G%' then 'HPT' 
       when CODE like 'H%' then 'TDT' 
       else 'PE' 
       end TEAM from df2", method = "raw") 

или это:

sqldf("select df2.CODE, coalesce(df1.TEAM, 'PE') TEAM 
     from df2 
     left join df1 on substr(df2.CODE, 1, 1) = df1.CODE")