2017-11-21 1 views
2

둘 이상의 데이터 프레임을 하나의 "마스터"데이터 프레임으로 병합하는 여러 스레드를 보았으나 대신 하나의 참조 데이터 프레임을 가져 와서 다른 여러 데이터 프레임에 적용하려고합니다 다른 데이터 프레임은 별도로 유지합니다. 나는 lapply와 'for'루프를 사용해 보았지만 그것을하는 법을 알지 못했습니다. (면책 조항 : 나는 R.에 새로운 해요)R - 하나의 데이터 프레임을 여러 데이터 프레임에 개별적으로 병합/결합

df_geo는 기준 dataframe이며, 다음과 같은 :

district sector cell village village_code 
west sectorA cellA villageA XXXXXXXX 
west sectorA cellA villageB XXXXXXXX 
west sectorB cellB villageC XXXXXXXX 
south sectorC cellC villageD XXXXXXXX 

의 유형에 특정 정보와 더 많은 열이 세 가지 다른 데이터 세트가 있습니다 그들이 포함하는 자료, 즉 배포, 설문 조사, 후속 조치. 모든 데이터 세트에는 지구, 부문, 셀 및 마을 (동일하게 이름이 지정된)에 대한 열이 있습니다. 예를 들어

> df_distr 
v1 district sector cell village  v2 v3 … 
.. west sectorA cellA villageA .. .. … 
.. west sectorA cellA villageB .. .. … 
.. west sectorB cellB villageC .. .. … 
.. south sectorC cellC villageD .. .. … 

> df_survey 
v1 v5 v6 district sector cell village  v7 … 
.. .. .. west sectorA cellA villageA .. .. 
.. .. .. west sectorA cellA villageB .. .. 
.. .. .. west sectorB cellB villageC .. .. 
.. .. .. south sectorC cellC villageD .. .. 

dataframe 각 컬럼의 다른 번호를 가지며, 상기 위치 변수들 각각에서 동일한 숫자 열의 아니다. 각 구역 - 부문 - 셀 - 마을 조합은 각 village_code와 같이 고유합니다. 구역 섹터 - 셀 - 마을 일치에 따라 8 자리 숫자 위치 ID를 기록하는 세 개의 데이터 프레임 각각에 village_code 열을 추가하려고합니다. 이상적으로, 열을 목록에 저장하는 대신 원래의 각 데이터 프레임에 추가하고 싶습니다. 나는 성공적으로 코드 등 df_distr <- left_join(df_distr, df_geo, by = c("district", "sector", "cell", "village"))를 사용하여이 하나씩 작업을 수행 할 수 있습니다

> df_distr 
v1 district sector cell village  v2 v3 … village_code 
.. west sectorA cellA villageA .. .. … XXXXXXXX 
.. west sectorA cellA villageB .. .. … XXXXXXXX 
.. west sectorB cellB villageC .. .. … XXXXXXXX 
.. south sectorC cellC villageD .. .. … XXXXXXXX 

> df_survey 
v1 v5 v6 district sector cell village  v7 … village_code 
.. .. .. west sectorA cellA villageA .. .. XXXXXXXX 
.. .. .. west sectorA cellA villageB .. .. XXXXXXXX 
.. .. .. west sectorB cellB villageC .. .. XXXXXXXX 
.. .. .. south sectorC cellC villageD .. .. XXXXXXXX 

하지만 난 더 효율적으로 할 수있는 방법을 싶습니다 따라서,이 같은보고를하고 싶습니다.

+0

내가 제대로 이해한다면, 당신은 그들 모두가'village_code'을 가질 수 있도록 참조 데이터 집합의 모든 데이터 집합을 가입 왼쪽하려면 붙여진? – useR

+0

@useR 예, 맞습니다. – ktf

답변

0

당신은 dataframes 재 할당없이 's는 village_code 열을 첨부 참조 속성에 의해 수정 data.table을 활용할 수 있습니다 df_distrdf_surveylapply의 결과로 인쇄됩니다

library(data.table) 

setDT(df_geo) 
setDT(df_distr) 
setDT(df_survey) 

lapply(list(df_distr, df_survey), 
     function(x) x[df_geo, village_code := i.village_code, 
        on=.(district, sector, cell, village)]) 

공지 것을을하지만, data.frames 자체가 성공적으로 수정되었습니다. 데이터를 수정에는 복사가 없기 때문에이 방법이 훨씬 더 빨리 재 할당보다 것을

library(purrr) 
walk(list(df_distr, df_survey), ~ .[df_geo, village_code := i.village_code, 
            on=.(district, sector, cell, village)]) 

참고 : 만 :=의 부작용을 원하는 경우에, 당신은 lapply/map처럼 작동하지만 출력을 억제 purrr::walk을 사용할 수 있습니다 .frames in place.

결과 :

> df_distr 
    v1 district sector cell village v2 v3 village_code 
1: ..  west sectorA cellA villageA .. ..  XXXXXXXX 
2: ..  west sectorA cellA villageB .. ..  XXXXXXXX 
3: ..  west sectorB cellB villageC .. ..  XXXXXXXX 
4: .. south sectorC cellC villageD .. ..  XXXXXXXX 

> df_survey 
    v1 v5 v6 district sector cell village v7 village_code 
1: .. .. ..  west sectorA cellA villageA ..  XXXXXXXX 
2: .. .. ..  west sectorA cellA villageB ..  XXXXXXXX 
3: .. .. ..  west sectorB cellB villageC ..  XXXXXXXX 
4: .. .. .. south sectorC cellC villageD ..  XXXXXXXX 

데이터 :

df_geo = read.table(text = "district sector cell village village_code 
west sectorA cellA villageA XXXXXXXX 
        west sectorA cellA villageB XXXXXXXX 
        west sectorB cellB villageC XXXXXXXX 
        south sectorC cellC villageD XXXXXXXX", header = TRUE) 

df_distr = read.table(text = "v1 district sector cell village  v2 v3 
.. west sectorA cellA villageA .. .. 
.. west sectorA cellA villageB .. .. 
.. west sectorB cellB villageC .. .. 
.. south sectorC cellC villageD .. ..", header = TRUE) 


df_survey = read.table(text = "v1 v5 v6 district sector cell village  v7 
.. .. .. west sectorA cellA villageA .. 
.. .. .. west sectorA cellA villageB .. 
.. .. .. west sectorB cellB villageC .. 
.. .. .. south sectorC cellC villageD ..", header = TRUE) 
-1

네 개의 데이터 프레임 그룹이 있다고 가정 해 보겠습니다. reference은 df_geo의 스탠드 인이며 tab* 데이터 프레임은 작업중인 알려지지 않은 테이블을 나타냅니다.

reference = data.frame(key = letters[1:10],value = 1:10) 
tab1 = data.frame(journey = LETTERS[1:3],key=letters[1:3]) 
tab2 = data.frame(trip = LETTERS[7:10],key=letters[7:10]) 
tab3 = data.frame(destination = LETTERS[4:8],key=letters[4:8]) 

목적은 서로 다른 데이터 프레임에 reference 합류한다. 여기

output = lapply(list(tab1=tab1,tab2=tab2,tab3=tab3),left_join,reference,by="key") 

I는 tab* 데이터 프레임의 이름리스트 (중요)을 만들고,이 경우 이들 각 left_join 동일한 기능을 적용 lapply를 사용한다. 함수를 지정하고 나면 함수에 필요한 다른 인수를 제공 할 수 있습니다.이 경우에는 조인 할 테이블 (reference)과 조인 방법을 나타내는 by="key"을 제공 할 수 있습니다.

이것은 데이터 프레임 목록을 반환하지만 사용자가 글로벌 환경에 다시 지정되도록하려는 것 같습니다.

lapply(names(output),function(x){ 
    assign(x,value=output[[x]],envir=globalenv()) 
}) 

우리가 lapply를 사용하는이 시간 우리는 우리가 이전 단계에서 할당 된 이름입니다 출력의 이름 (로 해. 우리 assign 이름으로 지구 환경에 그 이름을 가진 output의 값.

이제 모든 tab* 데이터 프레임이 업데이트되었으며이를 수행하기 위해 수행해야하는 모든 작업은 업데이트가 필요한 데이터 프레임의 명명 된 목록을 작성하는 것이 었습니다.

관련 문제