【问题标题】:recode data function other data重新编码数据功能其他数据
【发布时间】:2021-08-09 09:42:20
【问题描述】:

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

规则示例:

具有超过 3 个变量年份的数据

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

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

  • 超过 2 个相同年份,保留最频繁的年份
  • 频率相等:保持较高

也许举个例子会更清楚一点:

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

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


如果我的 ID 包含 8 年的数据,则第 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

如果你有解决方案,否则我会根据非空字段的数量进行选择

【问题讨论】:

  • 如果 y = y1 则 y+2= y3 但如果 y=y2 , y+2=y4 .....
  • 第 4 行规则 超过 2 个相同年份,保持最频繁和第 2 行相同的规则,如 raw1 (rule1) y3 ≤ y5 and y4
  • 对不起,我犯了一个错误规则:频率平等:保持较高
  • 是的,您可以省略 y1。我将查看详细结果以查看重叠条件
  • 我对我的解决方案进行了轻微修改,以便解决第二个数据集第 4 行的问题,其中包含 8 个 y 值。

标签: r dplyr purrr


【解决方案1】:

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

  • 我使用了 purrr 包中的 pmap_df 函数,该函数用于对数据帧进行逐行操作,因为您可以向其中传递多个参数
  • c(...) 捕获每一行中y 的所有值,除了ID 的值我被c(...)[-1] 省略了
  • 对于您的y + 2,我省略了每行的前两个值,因为它们不能是y + 2,而且因为我们还要检查y + 1 的每个y,所以两个表达式的长度必须相同。所以我只选择了那些有y + 2y + 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

【讨论】:

  • 谢谢。可以稍微解释一下你的代码,这样我就可以用我的其他规则来完成它。
  • 当然,规则 2 和 3 可能需要进行一些编辑,但到目前为止,它可以提供您想要的结果。我现在将添加一些注释。
  • 请检查我的更新,如果我需要解释更多,请告诉我。
  • 感谢您的解释。带有 ids 的行是我们有超过 3 个变量 y。非常感谢代码和速度。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 2017-09-09
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2022-09-23
  • 2021-04-13
相关资源
最近更新 更多