2017-04-05 98 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