首页 > 解决方案 > R中缺失的重新编码

问题描述

我正在尝试根据四个变量重新编码并创建一个变量。重新编码应该是这样的。如果四列中的任何一列的值为 1,则重新编码的值应为 1,即使存在任何 0。如果该行值只有 0 和 NA,那么重新编码的值应该是 0。如果它们都是 NA,那么重新编码的值应该是 NA。

我的数据看起来像这样。

a = c(1, 1, 1, 1, NA, 0, NA)
b = c(0, 1, NA, 1, 0, NA, NA)
c = c(1, NA, 1, 0, NA, 0, NA)
d = c(1, 0, NA, 1, NA, 0, NA)
df <- data.frame(a,b,c,d)

使用ifelse函数,我在下面得到这个。

> df$recoded <- ifelse(df$a== 1 | df$b == 1 | df$c == 1| df$d == 1, 1, 0)
> df
   a  b  c  d recoded
1  1  0  1  1       1
2  1  1 NA  0       1
3  1 NA  1 NA       1
4  1  1  0  1       1
5 NA  0 NA NA      NA
6  0 NA  0  0      NA
7 NA NA NA NA      NA

问题是当行中有 0 和 NA 时(即第 5 行和第 6 行),重新编码的值应该是 0 而不是 NA。

我想得到如下数据框。

> df
   a  b  c  d recoded
1  1  0  1  1       1
2  1  1 NA  0       1
3  1 NA  1 NA       1
4  1  1  0  1       1
5 NA  0 NA NA       0
6  0 NA  0  0       0
7 NA NA NA NA      NA

对此有什么想法吗?

提前致谢。

标签: rmissing-datarecode

解决方案


您可以使用apply

df$recoded <- apply(df, 1, function(x) ifelse(all(is.na(x)), NA, max(x, na.rm = TRUE)))
df
#   a  b  c  d recoded
#1  1  0  1  1       1
#2  1  1 NA  0       1
#3  1 NA  1 NA       1
#4  1  1  0  1       1
#5 NA  0 NA NA       0
#6  0 NA  0  0       0
#7 NA NA NA NA      NA

如果一行中的所有元素都是,NA否则df$recoded它将NA是该行的最大值(NA删除了 ')。


推荐阅读