我需要将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中实现这个目标吗?
提前致谢。
答案 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))