微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ifelse替换值,如果它小于以前的值

如何解决ifelse替换值,如果它小于以前的值

我正在使用数据中有错误的数据集。数字有时被错误注册。这是一些玩具数据示例:

Fake data

问题在于,“冲销”列仅应递增计数(按唯一ID)。因此,在0,1,2,3的向量中,跟在1和2之后的0不应为0。相反,它们应该等于之前获得的任何值。我试图通过使用dplyr软件包中的lag函数来对此进行补救:

Data$Reversal <- ifelse(Data$Reversal < lag(Data$Reversal),lag(Data$Reversal),Data$Reversal) 。 但这会导致许多问题:

  1. 一个值变为NA。我尝试在lag函数中使用default = Data $ Reversal调用,但无济于事。
  2. 每个唯一ID的“反转”值应重置为0。现在,它继续跨ID。我使用group_by(ID)尝试了一个凌乱的代码,但由于它破坏了我先前的ifelse函数,因此无法正常工作。
  3. 这仅在出现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 举报,一经查实,本站将立刻删除。