Мы можем использовать reshape
, чтобы получить длинный формат и взглянуть на colSums
.
Первое правило в таких вопросах - это приложение R опиатные имена столбцов, то есть <chr_prefix>.<num_suffix>
.
names(df) <- c("ID", paste(rep(c("normal", "patient"), each=3), 1:3, sep="."))
Теперь мы reshape
в длинном формате и разделим by
"ID"
.Нам нужны только те идентификаторы, в которых all
colSums
равны > 2
, мы сохраняем их в векторе s
, с которым мы можем поднастроить фрейм данных df
.
r <- reshape(df, idvar="ID", direction="long", varying=list(2:4, 5:7), times=1:3)
s <- by(r[-1], r$ID, function(i) all(colSums(i, na.rm=TRUE) > 2))
df[s, ]
# ID normal normal normal patient patient patient
# 2 g2 7 11 8 7 6 NA
# 3 g3 8 12 9 8 7 NA
# 4 g4 9 13 10 9 8 4
# 6 g6 11 NA 10 13 10 NA
Данные
df <- structure(list(Id = structure(1:6, .Label = c("g1", "g2", "g3",
"g4", "g5", "g6"), class = "factor"), a = 6:11, b = c(10L, 11L,
12L, 13L, NA, NA), c = c(7, 8, 9, 10, NA, 10), d = c(NA, 7, 8,
9, NA, 13), e = c(NA, 6L, 7L, 8L, 9L, 10L), f = c(NA, NA, NA,
4L, 5L, NA)), class = "data.frame", row.names = c(NA, -6L))