as long as you have the dataframe organized the way you do now i.e., comp1type1,comp1type2,comp1type3,comp2type1,…,comp[I]type[J]. I am sure you can use the following method.
ncomp <- 20 ntype <- 3 vecone <- df[,seq(1,ncomp*ntype,ntype)] vectwo <- df[,seq(2,ncomp*ntype,ntype)] vecthree <- df[,seq(3,ncomp*ntype,ntype)] # now that we have the vectors of types seperated into data.frame's # it'll be easier to do what we want # this first condition will find which rows type1/2 have No or NA for all condition1 <- rowSums(vecone=="No" | is.na(vecone)) == ncol(vecone) condition2 <- rowSums(vectwo=="No" | is.na(vectwo)) == ncol(vectwo) # this third condition will find which rows type3 have atleast one Yes condition3 <- rowSums(vecthree =="Yes",na.rm=T) >= 1
Now you may use these conditions to figure out how many rows include a Yes for any type3 and a No/NA for all type1/2
sum(condition1 & condition2 & condition3)