用所需值替换零
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
的列表并将其用于 replace
ing '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))
我希望删除所有具有 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
的列表并将其用于 replace
ing '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))