如何解决ifelse替换值,如果它小于以前的值
我正在使用数据中有错误的数据集。数字有时被错误注册。这是一些玩具数据示例:
问题在于,“冲销”列仅应递增计数(按唯一ID)。因此,在0,1,2,3
的向量中,跟在1和2之后的0不应为0。相反,它们应该等于之前获得的任何值。我试图通过使用dplyr软件包中的lag
函数来对此进行补救:
Data$Reversal <- ifelse(Data$Reversal < lag(Data$Reversal),lag(Data$Reversal),Data$Reversal)
。
但这会导致许多问题:
- 第一个值变为NA。我尝试在lag函数中使用default = Data $ Reversal调用,但无济于事。
- 每个唯一ID的“反转”值应重置为0。现在,它继续跨ID。我使用group_by(ID)尝试了一个凌乱的代码,但由于它破坏了我先前的ifelse函数,因此无法正常工作。
- 这仅在出现1个错误时有效。但是,如果连续出现两个错误,则只能修复1个值。
或者,我发现this线程中Andrie提供的答案似乎也很有希望。这可以解决问题1和3,但是我无法使此代码按ID正常工作(使用group_by函数)。
安德烈的答案:
local({
r <- rle(data)
x <- r$values
x0 <- which(x==0) # index positions of zeroes
xt <- x[x0-1]==x[x0+1] # zeroes surrounded by same value
r$values[x0[xt]] <- x[x0[xt]-1] # substitute with surrounding value
inverse.rle(r)
})
任何帮助将不胜感激。
解决方法
我认为cummax
确实可以满足您的需求。
基本R
dat$Reversal <- ave(dat$Reversal,dat$ID,FUN = cummax)
dat
# ID Owner Reversal Success
# 1 1 A 0 0
# 2 1 A 0 0
# 3 1 A 0 0
# 4 1 B 1 1
# 5 1 B 1 0
# 6 1 B 1 0
# 7 1 error 1 0
# 8 1 error 1 0
# 9 1 B 1 0
# 10 1 B 1 0
# 11 1 C 1 1
# 12 1 C 2 0
# 13 1 error 2 0
# 14 1 C 2 0
# 15 1 C 3 1
# 16 2 J 0 0
# 17 2 J 0 0
dplyr
dat %>%
group_by(ID) %>%
mutate(Reversal = cummax(Reversal)) %>%
ungroup()
data.table
as.data.table(dat)[,Reversal := cummax(Reversal),by = .(ID)][]
数据{@ {3}}
dat <- read.table(header = TRUE,text = "
ID Owner Reversal Success
1 A 0 0
1 A 0 0
1 A 0 0
1 B 1 1
1 B 1 0
1 B 1 0
1 error 0 0
1 error 0 0
1 B 1 0
1 B 1 0
1 C 1 1
1 C 2 0
1 error 0 0
1 C 2 0
1 C 3 1
2 J 0 0
2 J 0 0")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。