我在解決這個真實場景時遇到了問題。我有兩個資料表:
- dfEntitiesCountries:三字母物體與其路由國家的表
- temp:一大張裝運表,每個都有以下詳細資訊:AWB:貨物的識別符號 b. OriginCountry:貨件始發國的全稱 c. 路線:貨物經過的物體,用連字符分隔
dfEntity國家

臨時表

我需要弄清楚每批貨物的網關。Gateway 是 Route 中的物體,該物體位于貨件的 OriginCountry 之后。這意味著我需要排除與貨件的 OriginCountry 相對應的路線中的第一個物體,然后采用 RountingCountry 與 OriginCountry 不同的路線中的物體。
我寫了下面的代碼。問題是如果我將它用作獨立函式(GetGW),它會很好地作業。但是,當我在 vapply 中使用它以將其應用于臨時表中的所有貨件時,我會遇到一個錯誤:
“ [.data.table(dfEntitiesCountries[RouteEntities, on = .(Entity = V1), : i 的計算結果為邏輯向量長度為?? 3,但有 2 行。不再允許回收邏輯 i,因為它隱藏了比罕見的更多的錯誤方便。如果您確實需要回收,請顯式使用 rep(...,length=.N)。
GetGW <- function(RouteEntities,ShptOrgCnt){
setDT(as.list(RouteEntities))
GW <-dfEntitiesCountries[RouteEntities,on=.(Entity=V1),nomatch=0][RoutingCountry!=ShptOrgCnt,.(Entity)][[1]][1]%>% as.character()
}
temp[,`:=`(GateWay=vapply(strsplit(Route,"-"),GetGW,"character",ShptOrgCnt=OriginCountry))]
感謝您使用相同的方法或任何其他有效的方法來解決此案例的任何想法,因為我在實際表中有大約 200 萬件貨物。
uj5u.com熱心網友回復:
第 1 步:確定每個國家/地區的第一個縮寫:
dfEntitiesCountries[dfEntitiesCountries, Entity2 := first(i.Entity), on = .(RoutingCountry), by = .EACHI]
dfEntitiesCountries
# Entity RoutingCountry Entity2
# <char> <char> <char>
# 1: AMM J AMM
# 2: DXB UAE DXB
# 3: RUH SA JED
# 4: DOH Q DOH
# 5: LON UK LON
# 6: JED SA JED
第 2 步:形成temp2計算每個 AWB 的網關:
temp2 <- copy(temp)[dfEntitiesCountries, Orig := i.Entity2, on = .(OriginCountry = RoutingCountry)
][, strsplit(Route, "-"), by = .(AWB, Orig)
][dfEntitiesCountries, Gateway := i.Entity2, on = .(V1 = Entity)
][Orig != Gateway,
][, .SD[1,], by = .(AWB)]
第3步:把它帶回原來的temp:
temp[temp2, Gateway2 := i.Gateway, on = .(AWB)]
temp
# AWB OriginCountry Route GateWay Gateway2
# <num> <char> <char> <char> <char>
# 1: 1111 Q DOH-LON LON LON
# 2: 2222 SA RUH-JED-DXB DXB DXB
# 3: 3333 UAE DXB-AMM-RUH AMM AMM
資料
dfEntitiesCountries <- setDT(structure(list(Entity = c("AMM", "DXB", "RUH", "DOH", "LON", "JED"), RoutingCountry = c("J", "UAE", "SA", "Q", "UK", "SA")), row.names = c(NA, -6L), class = c("data.table", "data.frame")))
temp <- setDT(structure(list(AWB = c(1111, 2222, 3333), OriginCountry = c("Q", "SA", "UAE"), Route = c("DOH-LON", "RUH-JED-DXB", "DXB-AMM-RUH"), GateWay = c("LON", "DXB", "AMM")), row.names = c(NA, -3L), class = c("data.table", "data.frame")))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/525639.html
標籤:r功能加入数据表申请
上一篇:想要根據按鈕渲染組件
