重新编码数据功能其他数据
recode data function other data
我想重新编码我的数据,决策规则的功能
规则示例:
变量超过3年的数据
第一条规则:如果只有一个错误,我们会更正数据:
y ≤ y+2 且 y+1 < y 那么 y+1 = y
经过上次更正后,用第二条规则更正:
- 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
如果您对修正其他变量的变量函数有任何想法,非常感谢
如果我有一个包含 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
我想重新编码我的数据,决策规则的功能
规则示例:
变量超过3年的数据
第一条规则:如果只有一个错误,我们会更正数据:
y ≤ y+2 且 y+1 < y 那么 y+1 = y
经过上次更正后,用第二条规则更正:
- 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
如果您对修正其他变量的变量函数有任何想法,非常感谢
如果我有一个包含 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]
省略的 - 对于你的
y + 2
我省略了每一行的前两个值,因为它们不能是y + 2
并且因为我们也在检查每个y
长度的y + 1
两个表达式必须相同。所以我只选择了那些有y + 2
的 - 关于其他规则,我创建了一个名为
z
的向量,它只需要从x
中省略y1
并检查是否有 3 个唯一值,这意味着 2 个相同将所有其他人转换为该值
ID
的值除外
y + 1
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