重新编码数据功能其他数据

recode data function other data

我想重新编码我的数据,决策规则的功能

规则示例:

变量超过3年的数据

第一条规则:如果只有一个错误,我们会更正数据:
y ≤ y+2 且 y+1 < y 那么 y+1 = y

经过上次更正后,用第二条规则更正:

也许举个例子就更清楚了:

ID  y1  y2  y3   y4 y5
1   6   7   6   8   
2   6   7   7   6   8
3   6   7   8   7   8
4   6   7   8   6   7
6   3   4   5   6   3

修正后的数据

ID  y1  y2  y3   y4 y5
1   6   7   7   8   
2   6   7   7   7   8
3   6   7   8   8   8
4   6   7   7   7   7
6   3   4   5   6   3

如果您对修正其他变量的变量函数有任何想法,非常感谢


如果我有一个包含 8 年数据的 ID,则第 4 行不起作用。你知道为什么吗 ?很多NA有问题吗? 代码前:

ID  y1 y2  y3   y4  y5  y6  y7  y8
1   6   7   6   8   NA  NA  NA  NA
2   6   7   7   6   8   NA  NA  NA
3   6   7   8   7   8   NA  NA  NA
4   6   7   8   6   7   NA  NA  NA
5   3   4   5   6   3   NA  NA  NA
6   7   7   8   8   7   8   7   8

代码后

   y1  y2  y3  y4   y5  y6  y7  y8
1   6   7   7   8   NA  NA  NA  NA
2   6   7   7   7   8   NA  NA  NA
3   6   7   8   8   8   NA  NA  NA
4   6   7   8   6   7   NA  NA  NA
5   3   4   5   6   3   NA  NA  NA
6   7   7   8   8   8   8   8   8

如果有解决方法不然我会根据非空字段的个数做一个select

更新解决方案 我做了一点修改,以便它可以用于包含 NA 值的观察:

  • 我使用了 purrr 包中的 pmap_df 函数,该函数用于对数据框进行逐行操作,因为您可以将多个参数传递给它
  • c(...) 捕获每行中 y 的所有值,但我用 c(...)[-1]
  • 省略的 ID 的值除外
  • 对于你的 y + 2 我省略了每一行的前两个值,因为它们不能是 y + 2 并且因为我们也在检查每个 y 长度的 y + 1两个表达式必须相同。所以我只选择了那些有 y + 2
  • y + 1
  • 关于其他规则,我创建了一个名为 z 的向量,它只需要从 x 中省略 y1 并检查是否有 3 个唯一值,这意味着 2 个相同将所有其他人转换为该值
library(dplyr)
library(purrr)

df %>%
  pmap_df(~ {x <- c(...)[!is.na(c(...))][-1]
  y_2 <- x[-c(1, 2)]
  y_1 <- x[2:(length(y_2) + 1)]
  ids <- which((x[seq_along(y_2)] <= y_2) & (y_1 < x[seq_along(y_1)]))
  x[ids + 1] <- x[ids]
  x
  z <- x[-1]
  if(length(unique(z)) == 3 & sum(is.na(z)) == 0) {
    z[1:length(z)] <- z[duplicated(z)]
    c(x[1], z)
  } else {
    c(x[1], z)
  }})

# A tibble: 5 x 5
     y1    y2    y3    y4    y5
  <int> <int> <int> <int> <int>
1     6     7     7     8    NA
2     6     7     7     7     8
3     6     7     8     8     8
4     6     7     7     7     7
5     3     4     5     6     3

第二个数据样本

# A tibble: 6 x 8
     y1    y2    y3    y4    y5    y6    y7    y8
  <int> <int> <int> <int> <int> <int> <int> <int>
1     6     7     7     8    NA    NA    NA    NA
2     6     7     7     7     8    NA    NA    NA
3     6     7     8     8     8    NA    NA    NA
4     6     7     7     7     7    NA    NA    NA
5     3     4     5     6     3    NA    NA    NA
6     7     7     8     8     8     8     8     8