替换满足特殊条件的数据框中的行值

时间:2017-04-05 17:37:47

标签: r

我需要将0替换为1,但仅限于值组满足以下条件的情况; “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中实现这个目标吗?

提前致谢。

1 个答案:

答案 0 :(得分: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))