我想将数据框中的重复值替换为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到数据中。
答案 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