2014-07-26 102 views
0


減少行序列在該R長度

我正在尋找一個很好的方法來計算連續連續削減在data.table最長號碼(包1.9.2版本)中R.我可怕的失敗和任何幫助非常感謝。對於我試圖做的例子,減少值是一個值小於或等於以前的值(< =)。

下面是我正在處理的數據的玩具樣本。我也放下了迄今爲止最好的一次嘗試,但說實話卻犯了可怕的錯誤,並且返回了一個錯誤。我的嘗試也使用2 for循環,我不是非常熱衷於,因爲我被建議應用循環更常用於R.我已經嘗試搜索此網站和網絡的類似解決方案,但沒有任何運氣。行實際上我在我的整個數據表的數量剛剛超過100萬我都列數爲17

library(data.table) 

TEST_DF <- data.table(COL_1 = c(5,2,3,1), COL_2 = c(1,0,4,2), 
         COL_3 = c(0,1,6,3), COL_4 = c(0,0,0,4)) 

TEST_DF$COUNT <- as.numeric(0) 

for(i in 1:NROW(TEST_DF)) 
{ 
    for (j in 1:(NCOL(TEST_DF) - 1)) 
    { 
    TEST_DF$COUNT[j] <- if (TEST_DF[i, j, with = FALSE] >= 
          TEST_DF[i, j + 1, with = FALSE]) 
         { 
          TEST_DF$COUNT[j] + 2 
         } 
    } 
} 

DESIRED <- data.table(COL_1 = c(5,2,3,1), COL_2 = c(1,0,4,2), 
         COL_3 = c(0,1,6,3), COL_4 = c(0,0,0,4), 
         COUNT = c(4,2,1,0)) 

所需的輸出出現在代碼的底部。由於4個「COL」列出現在最長的縮減順序中,第一行的COUNT列將得到值4.在第二行中,前2列和後2列減少但沒有在這之間,COUNT會爲此得到2的值。在最後一列中,從COL_3減少到COL_4,因此COUNT在該行將獲得2的值。在沒有減少的任何行中,例如最後的COUNT值將爲0。

讓我知道是否需要進一步澄清或信息。

非常感謝你提前。

+1

這有點兒難看,所以我不想將它張貼作爲一個答案,但也許有人會拿出一些更加優雅:'sapply(1:nrow (TEST_DF),函數(x){tmp < - 其中(c(0,diff(order(TEST_DF [x,],decrease = TRUE)))<1) = ncol(TEST_DF) - 1)0 else tmp; min(ncol(TEST_DF),tmp)})'給我'4 2 1 0''if'行在那裏處理最後一行的特殊情況。 – rawr

+0

歡呼聲,幫助Rawr。你的功能可行,但@ Andrie's在他的佈局方式中更容易理解。 –

回答

1

可以使用的功能diff()rle()建立一個函數來壓縮運行長度。然後使用apply()在您的數據行:

foo <- function(x) { 
    runs <- rle(c(x[2] <= x[1], diff(x) <= 0)) 
    if(all(runs$value == 0)) 0 else max(runs$lengths[runs$value == 1]) 
} 

apply(TEST_DF, 1, foo) 

[1] 4 2 1 0 
+0

謝謝安德烈。這就是訣竅,你的解決方案非常簡潔明瞭。乾杯:) –

0

我用四個循環來完成你要找的東西。 apply對每一行起作用,for循環比較連續的列。

COUNT <- rep(0,4) 
for (i in 1:(ncol(TEST_DF)-1)) { 
    COUNT<-COUNT+apply(TEST_DF,1,function(x) ifelse(x[i]>=x[i+1],1,0)) 
} 

這會產生:3,2,1,0,因爲在第一行有3個縮減。最後一列沒什麼可比較的,所以只能有三個比較。我不確定你爲什麼希望它是4?

如果你想指望成爲您的原始表的一部分:

TEST_DF$COUNT<-COUNT