Во-первых, вы должны сделать правду NA
с. Вы делаете 'NA'
, который является строкой и отличается от NA
. Мы можем исправить это так:
df[df == "NA"] <- NA
Тогда мы могли бы посмотреть на apply
, где все столбцы 2:4
равны NA
, и соответственно установить столбцы activity_*
.
df[apply(df[2:4], 1, function(x) all(is.na(x))), 5:7] <- NA
Или векторизация, как @ akrun предлагает:
df[!rowSums(!is.na(df[2:4])), 5:7] <- NA
df
# ID orig_1 orig_2 orig_3 activity_1 activity_2 activity_3
# 1 1001 -7 1 -7 1 0 0
# 2 1002 2 1 3 1 1 1
# 3 1003 1 2 <NA> 1 1 0
# 4 1004 1 1 1 1 0 0
# 5 1005 <NA> 3 <NA> 0 0 1
# 6 1006 2 2 2 0 1 0
# 7 1007 3 2 <NA> 0 1 1
# 8 1008 <NA> 3 1 1 0 1
# 9 1009 <NA> <NA> <NA> NA NA NA
# 10 1010 2 2 2 0 1 0
# 11 1011 2 2 2 0 1 0
Данные
df <- structure(list(ID = c(1001, 1002, 1003, 1004, 1005, 1006, 1007,
1008, 1009, 1010, 1011), orig_1 = structure(c(NA, 3L, 2L, 2L,
5L, 3L, 4L, 5L, 5L, 3L, 3L), .Label = c("-7", "1", "2", "3",
"NA"), class = "factor"), orig_2 = structure(c(1L, 1L, 2L, 1L,
3L, 2L, 2L, 3L, 4L, 2L, 2L), .Label = c("1", "2", "3", "NA"), class = "factor"),
orig_3 = structure(c(NA, 4L, 5L, 2L, 5L, 3L, 5L, 2L, 5L,
3L, 3L), .Label = c("-7", "1", "2", "3", "NA"), class = "factor"),
activity_1 = c(1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0), activity_2 = c(0,
1, 1, 0, 0, 1, 1, 0, 0, 1, 1), activity_3 = c(0, 1, 0, 0,
1, 0, 1, 1, 0, 0, 0)), .Names = c("ID", "orig_1", "orig_2",
"orig_3", "activity_1", "activity_2", "activity_3"), row.names = c(NA,
-11L), class = "data.frame")