在R

时间:2018-07-30 20:21:29

标签: r missing-data recode

我正在尝试根据这四个变量重新编码并创建一个变量。重新编码应该是这样的。如果四列中的任何一列的值为1,则即使存在0,重新编码的值也应为1。如果该行的值只有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

问题是当行(即第5和第6行)中有0和NA时,重新编码的值应为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

对此有何想法?

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用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)。