我正在尝试根据这四个变量重新编码并创建一个变量。重新编码应该是这样的。如果四列中的任何一列的值为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
对此有何想法?
谢谢。
答案 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
)。