2017-03-03 1 views
0

초보자 인 data.table에서 조인을 수행 한 다음 열을 돌연변이했습니다. data.table join then add columns to existing data.frame without re-copy 스레드가 발견되었지만 더 이상 진행할 수 없었습니다.중간 테이블을 사용하지 않고 data.table을 사용하여 변이했습니다.

dplyr을 사용하여 원하는 작업을 수행 할 수 있지만 크기 때문에 실제 데이터에서이 코드를 실행할 수는 없습니다. 게다가 전술 한 이유로 인해 중간 테이블을 만들 수 없습니다. 여기

dplyr

입력

DFI = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P1234", 
"P1234", "P1234", "P2345", "P2345", "P3456", "P4567"), SO_ID = c("S1", 
"S1", "S1", "S2", "S2", "S2", "S3", "S4", "S7", "S10"), F_Year = c(2012, 
2012, 2012, 2013, 2013, 2013, 2011, 2011, 2014, 2015), Product_ID = c("385X", 
"385X", "385X", "450X", "450X", "900X", "3700", "3700", "A11U", 
"2700"), Revenue = c(1, 2, 3, 34, 34, 6, 7, 88, 9, 100), Quantity = c(1, 
2, 3, 8, 8, 6, 7, 8, 9, 40), Location1 = c("MA", "NY", "WA", 
"NY", "WA", "NY", "IL", "IL", "MN", "CA")), .Names = c("PO_ID", 
"SO_ID", "F_Year", "Product_ID", "Revenue", "Quantity", "Location1" 
), row.names = c(NA, 10L), class = "data.frame") 

룩업 테이블을 사용하여 내 데이터와 솔루션입니다

DF_Lookup = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P2345", 
"P2345", "P3456", "P4567"), SO_ID = c("S1", "S2", "S2", "S3", 
"S4", "S7", "S10"), F_Year = c(2012, 2013, 2013, 2011, 2011, 
2014, 2015), Product_ID = c("385X", "450X", "900X", "3700", "3700", 
"A11U", "2700"), Revenue = c(50, 70, 35, 100, -50, 50, 100), 
    Quantity = c(3, 20, 20, 20, -10, 20, 40)), .Names = c("PO_ID", 
"SO_ID", "F_Year", "Product_ID", "Revenue", "Quantity"), row.names = c(NA, 
7L), class = "data.frame") 

출력

,536,913 dplyrcompare 내가 DFI로 룩업 테이블에서 새 항목을 추가 가입 왼쪽으로 사용하고

을 : 63,210

DFO = structure(list(PO_ID = c("P1234", "P1234", "P1234", "P1234", 
"P1234", "P1234", "P2345", "P2345", "P3456", "P4567"), SO_ID = c("S1", 
"S1", "S1", "S2", "S2", "S2", "S3", "S4", "S7", "S10"), F_Year = c(2012, 
2012, 2012, 2013, 2013, 2013, 2011, 2011, 2014, 2015), Product_ID = c("385X", 
"385X", "385X", "450X", "450X", "900X", "3700", "3700", "A11U", 
"2700"), Revenue = c(16.6666666666667, 16.6666666666667, 16.6666666666667, 
35, 35, 35, 100, -50, 50, 100), Quantity = c(1, 1, 1, 10, 10, 
20, 20, -10, 20, 40), Location1 = c("MA", "NY", "WA", "NY", "WA", 
"NY", "IL", "IL", "MN", "CA")), .Names = c("PO_ID", "SO_ID", 
"F_Year", "Product_ID", "Revenue", "Quantity", "Location1"), row.names = c(NA, 
10L), class = "data.frame") 

여기 여기 두 개의 라이브러리를 사용하고 dplyr

를 사용하여 내 코드입니다. 그런 다음 그룹의 행 수를 기반으로 수익 및 열을 나누고 있습니다. 이것은 그룹화 할 때 숫자의 팽창을 막기 위해서입니다.

compare(DF_Generated,DFO,allowAll = TRUE) 
TRUE 

내가 진심 거라고 어떤 도움을 주셔서 감사합니다 :

DF_Generated <- DFI %>% 
    dplyr::left_join(DF_Lookup,by = c("PO_ID", "SO_ID", "F_Year", "Product_ID")) %>% 
    dplyr::group_by(PO_ID, SO_ID, F_Year, Product_ID) %>% 
    dplyr::mutate(Count = n()) %>% 
    dplyr::ungroup()%>% 
    dplyr::mutate(Revenue = Revenue.y/Count, Quantity = Quantity.y/Count) %>% 
    dplyr::select(PO_ID:Product_ID,Location1,Revenue,Quantity) 

다음은 출력 일치하는 방법입니다.

+1

확인. 내가하고있는 일은 왼쪽 조인입니다. 결과에서 컬럼을 변경합니다. 그럼에도 불구하고 몇 줄을 써 보겠습니다. 나는 논리를 추가했다. – watchtower

답변

3

그것은 단순히 오히려 새 테이블 만들기보다, ("가입 갱신의"에서) DFI에 열을 추가하는 것이 더 효율적입니다 :

DFI[DF_Lookup, on=.(PO_ID, SO_ID, F_Year, Product_ID), 
    `:=`(newrev = i.Revenue/.N, newqty = i.Quantity/.N) 
, by=.EACHI] 

    PO_ID SO_ID F_Year Product_ID Revenue Quantity Location1 newrev newqty 
1: P1234 S1 2012  385X  1  1  MA 16.66667  1 
2: P1234 S1 2012  385X  2  2  NY 16.66667  1 
3: P1234 S1 2012  385X  3  3  WA 16.66667  1 
4: P1234 S2 2013  450X  34  8  NY 35.00000  10 
5: P1234 S2 2013  450X  34  8  WA 35.00000  10 
6: P1234 S2 2013  900X  6  6  NY 35.00000  20 
7: P2345 S3 2011  3700  7  7  IL 100.00000  20 
8: P2345 S4 2011  3700  88  8  IL -50.00000 -10 
9: P3456 S7 2014  A11U  9  9  MN 50.00000  20 
10: P4567 S10 2015  2700  100  40  CA 100.00000  40 

이 상기에 링크 된 Q & 꽤 자연의 확장이다 OP.

i의 각 행에 의한 그룹 ; .N은 그룹에있는 행 수입니다.

rev 및 qty cols를 덮어 쓰려면 `:=`(Revenue = i.Revenue/.N, Quantity = i.Quantity/.N)을 사용하십시오.

+0

환상적. 감사. Old Revenue and Quantity를 제거하려면 어떻게해야합니까? 그 조각도 추가 할 수 있으면 고맙겠습니다. – watchtower

+1

@watchtower'\': = \'()'안에 그들의 이름을 사용할 수 있으며, 그 열은 덮어 쓰여질 것입니다. (나는 보통 그런 것을 덮어 쓰는 것을 주저한다.) – Frank

+0

Frank. 매우 도움이됩니다. 나는 .EACHI에 쓰레드를 읽고있다. 위의 코드에서 그룹화되는 항목을 어떻게 알 수 있습니까? 에서처럼, 나는 그것이'PO_ID','SO_ID','F_Year','Product_ID'라고 생각하십니까? 그렇다면 어떻게하면'PO_ID','SO_ID','F_Year'와 같이 4 개의 컬럼 중 3 개만을 그룹화하도록 코드를 수정할 수 있습니까? 나는 이것이 다른 질문이라는 것을 알고 있으며 그것에 대한 새로운 스레드를 만들 수 있습니다. 저에게 알려주세요. – watchtower

관련 문제