2017-04-05 213 views
1

我需要用1替換0,但僅限於組值滿足以下條件的情況; 「1 0 1」或「0 1」(如果在開始處)或「1 0」(如果在結尾處)。給出的示例數據框:替換滿足特殊條件的數據幀中的行值

df <- data.frame(a = c(1,0,1,0,1,1,1,0,1,1,1), 
       b = c(1,1,1,0,1,1,1,0,1,1,1), 
       c = c(1,0,1,1,1,0,1,0,1,1,1), 
       d = c(1,1,1,0,1,1,1,1,1,1,1), 
       e = c(1,0,1,0,1,1,1,1,1,1,1), 
       f = c(1,1,1,1,1,1,1,1,1,0,1)) 
df 

那就需要返回此:

df.result <- data.frame(a = c(1,1,1,0,1,1,1,0,1,1,1), 
         b = c(1,1,1,0,1,1,1,0,1,1,1), 
         c = c(1,1,1,1,1,1,1,0,1,1,1), 
         d = c(1,1,1,0,1,1,1,1,1,1,1), 
         e = c(1,1,1,0,1,1,1,1,1,1,1), 
         f = c(1,1,1,1,1,1,1,1,1,1,1)) 
df.result 

注意相關0的已更改爲1的。本質上,我試圖替換連續出現的所有0。

任何想法如何在R中實現這一點?

在此先感謝。

+0

'rollapply()'從包'zoo'可能是每行有用。 ...或從'base'輸入'rle()' – jogo

回答

1

這裏是rle()溶液:

foo <- function(x) { 
    r <- rle(x) 
    r$values[r$values==0 & r$lengths==1] <- 1 
    inverse.rle(r) 
} 
foo(c(0,1,0,0,1,0,1)) # testing the working horse: 
# [1] 1 1 0 0 1 1 1 

現在起每行應用此功能並給出了結果的期望的形式。 apply()脅迫其第一個參數矩陣:

t(apply(df, 1, foo)) 
# > t(apply(df,1,foo)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 1 1 1 1 1 
# [2,] 1 1 1 1 1 1 
# [3,] 1 1 1 1 1 1 
# [4,] 0 0 1 0 0 1 
# [5,] 1 1 1 1 1 1 
# [6,] 1 1 1 1 1 1 
# [7,] 1 1 1 1 1 1 
# [8,] 0 0 0 1 1 1 
# [9,] 1 1 1 1 1 1 
# [10,] 1 1 1 1 1 1 
# [11,] 1 1 1 1 1 1 

如果你想有一個數據幀的結果,你可以這樣做:

df.result <- df 
df.result[,] <- t(apply(df,1,foo)) 
+0

謝謝!多好的解決方案。 – Ross