将重复值替换为0

时间:2019-04-18 13:34:02

标签: r

我想将数据框中的重复值替换为0。允许重复的次数。

a<-c(1,2,3,4,4,4,5,5,5,5,5,9,9,150,220,220)

如果允许的重复次数为4,则预期的解决方案应类似于:

a_new<-c(1,2,3,4,4,4,0,0,0,0,0,9,9,150,220,220)

大于4的重复值将替换为0。

使用角色

b<-rle(a)

我可以确定重复次数

Run Length Encoding
  lengths: int [1:8] 1 1 1 3 5 2 1 2
  values : num [1:8] 1 2 3 4 5 9 150 220

并将其替换为0

b$values[b$lengths>4]<-0

Run Length Encoding
  lengths: int [1:8] 1 1 1 3 5 2 1 2
  values : num [1:8] 1 2 3 0 0 9 150 220

问题是在这种情况下如何将重复插入0到数据中。

5 个答案:

答案 0 :(得分:2)

您可以使用inverse.rle

a_new<-c(1,2,3,4,4,4,0,0,0,0,0,9,9,150,220,220)

b <- rle(a_new)

b$values[b$lengths>4]<-0

inverse.rle(b)

[1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220

答案 1 :(得分:1)

您也可以通过以下方式实现这一目标

with(rle(a), rep(values * (lengths <= 4), lengths))
# [1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220

以便我们在rle(a)内部进行操作,并直接对inverse.rle进行修改:

inverse.rle
# function (x, ...) 
# {
#     if (is.null(le <- x$lengths) || is.null(v <- x$values) || 
#         length(le) != length(v)) 
#         stop("invalid 'rle' structure")
#     rep.int(v, le) # The same except for le <= 4
# }
# <bytecode: 0x10470b4a8>
# <environment: namespace:base>

答案 2 :(得分:1)

另一种通过ave的方式,

a[ave(a, a, FUN = length) > 4] <- 0
a
#[1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220

答案 3 :(得分:1)

还有一种可能性:

(a != rle(a)$values[rle(a)$lengths > 4]) * a

 [1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220

答案 4 :(得分:1)

使用rleid

library(data.table)
data.table(a)[, a1 := if(.N >4) 0 else a, rleid(a)]$a1
#[1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220