2014-10-21 3 views
1

프로그래밍 이외에도이 문제에 대한 올바른 접근 방식을 놓치고 있습니다. 시장 이름 열이있는 2 개의 데이터 프레임이 있습니다. 불행히도 이름은 각 열의 문자/기호에 따라 다릅니다 (예 : 알바니 .Schenectady.Troy = ALBANY, Boston.Manchester = BOSTON.열의 값을 문자열로 추출하고 데이터 프레임 열의 값을 바꿉니다

두 데이터 프레임 모두에서 시장 이름을 표준화하여 나중에 merge 작업을 수행 할 수 있습니다.

두 단계로 문제를 해결할 생각 : 1) 두 테이블에서 고유 한 시장 이름의 벡터를 만들고이를 사용하여 조회 테이블을 만듭니다. 다음과 같이 보이는 것 :

표 1 시장> "Albany.Schenectady.Troy", "Albuquerque.Santa.Fe", "Atlanta". . . .

표 2 시장> "SPOKANE", "BOSTON". . .

나는 marketnamesvector <- paste(unique(Table1$Market, sep = "", collapse = ","))을 시도했지만 원하는 출력을 생성하지 못했습니다.

2) 표 2의 시장 이름을 표 1의 동등한 시장 이름으로 변경하십시오. 표 1에서 사용할 수없는 시장 이름에 대해서는 표 2에서 시장 이름에 동일한 값을 유지해야합니다.

나는 아래와 같이 루핑 기능을 사용할 수 있지만 필자는 여전히 룩업 테이블이 필요하다는 것을 알고있다.

replacefunc <- function (data, oldvalue, newvalue) { newdata <- data for (i in unique(oldvalue)) newdata[data == i] <- newvalue[oldvalue == i] newdata }

표 1 :이 테이블은 90 행 × 2 열이며, 90 개 고유의 시장 이름을 가지고있다.

    Market Leads Investment   Leads1  Leads2 Leads3 
1 Albany.Schenectady.Troy  NA   NA   NA  NA  NA 
2 Albuquerque.Santa.Fe  NA   NA   NA  NA  NA 
3     Atlanta  NA   NA   NA  NA  NA 
4     Austin  NA   NA   NA  NA  NA 
5    Baltimore  NA   NA   NA  NA  NA 

표 2 :이 표는 150K 행 x 20 열이며 89 개의 고유 한 시장 이름이 있습니다.

Spot.ID Date Hour  Time Local.Date Broadcast.Week Local.Hour Local.Time Market 
2 13072765 6/30/14 0 12:40 AM 2014-06-29    1   21 9:40 PM SPOKANE 
261 13072946 6/30/14 5 5:49 AM 2014-06-30    1   5 5:49 AM BOSTON 
356 13081398 6/30/14 10 10:52 AM 2014-06-30    1   7 7:52 AM SPOKANE 
389 13082306 6/30/14 11 11:25 AM 2014-06-30    1   8 8:25 AM SPOKANE 
438 13082121 6/30/14 8 8:58 AM 2014-06-30    1   8 8:58 AM BOSTON 
469 13081040 6/30/14 9 9:17 AM 2014-06-30    1   9 9:17 AM ALBANY 
482 13080104 6/30/14 12 12:25 PM 2014-06-30    1   9 9:25 AM SPOKANE 
501 13082120 6/30/14 9 9:36 AM 2014-06-30    1   9 9:36 AM BOSTON 
617 13080490 6/30/14 13 1:23 PM 2014-06-30    1   10 10:23 AM SPOKANE 
+0

루프에서 [regexpr] (http://stackoverflow.com/questions/3539826/whats-the-r-equivalent-of-sqls-like-description-statement/3540002#3540002) 함수를 사용할 수 있습니다. 표 1의 각 시장 이름과 표 2의 모든 이름 사이의 유사성을 계산합니다.그런 다음 유사성 점수를 기반으로 표 1의 이름을 표 2의 가장 가까운 이름으로 바꿀 수 있습니다. 효율적이지는 않지만 코드 작성은 간단합니다. 이 문제에 정말로 효율성이 필요합니까? – Jealie

+0

두 파일의 이름을 모두 공유 할 수 있습니까? 현재의 질문에서 알 수 있듯이''gsub ("\\ .. * $", "", x)'와 같이 Albany와 Albuquerque를 취하기를 원할 수도 있습니다. 모든 이름을 제공 할 수 있다면 더 많은 지원을받을 것으로 생각됩니다. – jazzurro

+0

아이디어로, 기간에 표 1 시장 이름을 strsplit 한 다음 tolower()와 표 2의 시장 이름을 입력하십시오. 두 열에 대해 setdiff()를 호출하면 몇 가지 표 2의 이름을 바꿀 수 있습니다. 요인) 아주 쉽게. 이름을 동일하게 만들면 병합 할 수 있습니다. – lawyeR

답변

2

> df

데이터가 데이터 프레임 DF1, DF2에 있다고 가정한다. 목표는 시장 이름을 동일하게 조정하는 것이며 현재는 약간 다릅니다.

먼저 시장을 나열하고 다음 명령을 사용하여 df1의 고유 이름을 나열하고 df2를 반복합니다.

mk1 <- sort(unique(df1$market)) 
mk2 <- sort(unique(df2$market)) 
dmk12 <- setdiff(mk1,mk2) 
dmk21 <- setdiff(mk2,mk1) 

다른 시장을 식별하려면 dmk12와 dmk21을 사용하십시오. 어떤 이름을 사용할지 결정하고 어떻게 일치하는지 확인하고 df1에서 df2에서 "Atlanta"로 "Atlanta, GA"를 변경하십시오. 그런 다음

df2[df2$market=="Atlanta","market"] = "Atlanta, GA" 

을 사용하는 형식 만 수정 90 개 이름을 가지고 있다면, 위의 같은 90 개 변화 라인을 작성합니다

df_to_change[df_to_change[,"column"]=="old data", "column"] = "new data" 

입니다.

모든 이름을 조정 한 후에는 sort (unique (df))를 다시 수행하고 setdiff를 두 번 사용하여 모든 이름이 같은지 확인하십시오.

+0

실제로'data.frame' 조회를 작성하고 병합 작업을 수행했습니다. 수동으로 90 개의 이름을 스캔하여 정확하게 일치시켜야했습니다. 위의 의견에서 언급 한 아이디어를 아직 시도하지 않았습니다. – vagabond

관련 문제