2016-11-17 74 views
0

我有以下的情況: 甲數據幀DF具有以下結構替換值的使用雙塔條件

Code Value Step1 Step2 Step3 
123  1  2  4  0 
234  2  9  1  4 
799  4  0  0  0 
311  9  1  2  0 

我需要一種方法,以獲得在另一個數據幀以下的情況,而不使用環並且由於真實的數據幀具有8個開始步驟和大約23百萬行這一事實而具有優異的性能: 將Stepx列中的數字替換爲與列值匹配的Code列中的值,並將第一個0替換爲代碼列值,獲得以下內容:

Code Value Step1 Step2 Step3 Step4 
123  1  234  799  123  0 
234  2  311  123  799  234 
799  4  799  0  0  0 
311  9  123  234  311  0 

感謝

+0

對不起,這是一個錯誤,我編輯了正確的情況,23米的行和7列的步驟在起始數據框中,我應該有結果相同的行數和1額外的列謝謝評論 –

+0

如果原始數據集有2300萬行,是否有與相應的值一樣多的代碼?如果不是,您的數據中的代碼和值如何顯示?現在他們每個人都有自己的專欄,就像你的數據一樣嗎? – LAP

+0

@Leo你的問題的答案是肯定的,在真實情況下的代碼欄可以假設從1000開始到50億的值 –

回答

0

這裏的部分解決方案:

require(data.table) 

x <- data.table(Code = c(123, 234, 799, 311), 
       value = c(1,2,4,9), 
       Step1 = c(2,9,0,1), 
       Step2 = c(4,1,0,2), 
       Step3 = c(0,4,0,0), 
       Step4 = c(0,0,0,0)) 

x[,grep("^Step", colnames(x), value = T):=lapply(x[,grep("^Step", colnames(x), value = T), with = F], function(val) x$Code[match(val, x$value)])] 
x[is.na(x)] <- 0 

first_null <- apply(x[,grep("^Step", colnames(x), value = T), with = F], 1, function(val) min(which(val == 0))) 

它替換爲每個 「StepX」。但是,在不使用for循環的情況下,將第一個空行替換是有點棘手的。我給了它一個鏡頭,並寫了另一個適用於確定在哪一步null必須替換爲每一行......但沒有想到一種方法來優雅的方式。

如果沒有其他答覆,我可能會在稍後嘗試破解這個螺母。

+0

[R]到目前爲止解決的部分的基本代碼是:'df1 [,grep(「^ Step」,colnames(df1),value = T] < - lapply(df1 [,grep(「^ Step」, (x,df1 $ Value)]; replace(x1,is.na(x1),0)})(Credit(df1),value = T],function(x){x1 < - df1 $ Code [ (x == 0)),然後'first_null < - sapply(apply(df1 [,grep(「^ Step」,colnames(df1),value = T)],函數(x){x [1]})'我同意矢量化的解決方案似乎不太可能,也許是一個嵌套的'應用'調用行,然後使用像'cumsum'的列? – LAP

+0

我試過嵌套適用於轉換StepX矩陣轉換爲字符串向量,然後嘗試用簡單的'sub()'替換第一個零...然後將整個事物轉換回數字,但不知何故,它變得相當混亂,不想正常工作。找到位置索引(我做了),然後用它們的座標替換矩陣內的值(我可以認爲這裏只有'for'循環)將會是更快。 –

+0

另外...它是一種主觀的脫離主題,但使用'data.table'後,最終我以某種方式發現'data.frame'冗餘。因此沒有基礎解決方案 –