用所需值替换零

Replacing zeros with a desired value

我希望删除所有具有 4 个或更多连续 0 值和 NaN 的 0 值。将不胜感激。

我有以下数据:

 A B C
 1 2 0
 0 8 0
 0 0 0
 0 0 0
 0 0 8
 0 4 9

我想要得到的东西:

  A B C
  1 2 Na
 Na 8 Na
 Na 0 Na
 Na 0 Na
 Na 0 8
 Na 4 9

我们可以使用rle来做到这一点。使用 lapply 遍历列,在逻辑向量 (x==0) 上使用 rle 到 return 相同的相邻元素 ('values') 及其 lengths),将 lengths 不大于或等于 4 的 'values' 分配给 FALSE,取消列出带有 inverse.rle 的列表并将其用于 replaceing 'x' 到 NA

的值
df1[] <- lapply(df1, function(x) {
     i1 <- inverse.rle(within.list(rle(x == 0),
                 values[!(values & lengths >=4)] <- FALSE))
     replace(x, i1, NA)
   })

df1
#   A B  C
#1  1 2 NA
#2 NA 8 NA
#3 NA 0 NA
#4 NA 0 NA
#5 NA 0  8
#6 NA 4  9

或带有 rleid

的选项
library(data.table)
library(dplyr)
df1 %>% 
   mutate(across(everything(), ~ replace(., . == 0 &
            ave(., rleid(.), FUN = length) >= 4, NA) ))

数据

df1 <- structure(list(A = c(1L, 0L, 0L, 0L, 0L, 0L), B = c(2L, 8L, 0L, 
0L, 0L, 4L), C = c(0L, 0L, 0L, 0L, 8L, 9L)), class = "data.frame", 
row.names = c(NA, 
-6L))