我想找出一些缺失的现象,这些迹象表明清理/数据错误。
我的数据框多年来包含许多帐户。以下是遵循的规则:
在下面的数据中,帐户A-E显示2001-2004年的金额。
df <- tribble(
~account, ~"2001", ~"2002", ~"2003", ~"2004",
"Account.A", 100, 90, 87, 80, #<Good
"Account.B", 0, 20, 30, 33, #<Good
"Account.C", 50, 55, 0, 0, #<Good
"Account.D", 200, 210, NA, 210, #<Bad
"Account.E", 150, 0, 212, 211) #<Bad
帐户A,B,C显示良好的数据:
帐户D和E显示错误数据:
我的目标是识别中断的行(D,E)并标记它们。
我想要一个可以在很多年和数千个帐户中推广的解决方案。
答案 0 :(得分:1)
这是一个tidyverse
选项,它可能不是最漂亮的,但应该可以解决问题:
library(tidyverse)
df %>%
gather(year, value, `2001`:`2004`) %>%
group_by(account) %>%
mutate(order = if_else(year == min(year), 'first',
if_else(year == max(year), 'last', 'mid'))) %>%
mutate(value = replace(value, is.na(value), 0)) %>%
mutate(start0 = row_number() >= min(row_number()[value != 0]),
end0 = row_number() <= max(row_number()[value != 0])) %>%
mutate(check = if_else(order == 'mid' & value == 0 & start0 == TRUE & end0 == TRUE, TRUE, FALSE)) %>%
filter(check == TRUE)
# A tibble: 2 x 7
# Groups: account [2]
account year value order start0 end0 check
<chr> <chr> <dbl> <chr> <lgl> <lgl> <lgl>
1 Account.E 2002 0 mid TRUE TRUE TRUE
2 Account.D 2003 0 mid TRUE TRUE TRUE
这里是一个解释: