Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R-Loop through data frame and count values greater than a value and removing rows

Tags:

loops

dataframe

r

I want to loop through a large dataframe counting in the first column how many values >0, removing those rows that were counted.... then moving on to column 2 counting the number of values>0 and removing those rows etc...

the data frame

  taxonomy A B C
1      cat 0 2 0
2      dog 5 1 0
3    horse 3 0 0
4    mouse 0 0 4
5     frog 0 2 4
6     lion 0 0 2

can be generated with

DF1 = structure(list(taxonomy = c("cat", "dog","horse","mouse","frog", "lion"),
                A = c(0L, 5L, 3L, 0L, 0L, 0L), D = c(2L, 1L, 0L, 0L, 2L, 0L), C = c(0L, 0L, 0L, 4L, 4L, 2L)), 
                .Names = c("taxonomy", "A", "B", "C"), 
                row.names = c(NA, -6L), class = "data.frame")

and i expect the outcome to be

      A B C
count 2 2 2

i wrote this loop but it does not remove the rows as it goes

res <- data.frame(DF1[1,], row.names = c('count'))
for(n in 1:ncol(DF1)) {
  res[colnames(DF1)[n]] <- sum(DF1[n])
  DF1[!DF1[n]==1] 
  }

it gives this incorrect result

      A B C
count 2 3 3
like image 820
s.shi Avatar asked Jan 18 '26 03:01

s.shi


1 Answers

You could do ...

DF = DF1[, -1]
cond = DF != 0
p = max.col(cond, ties="first")
fp = factor(p, levels = seq_along(DF), labels = names(DF))
table(fp)

# A B C 
# 2 2 2 

To account for rows that are all zeros, I think this works:

fp[rowSums(cond) == 0] <- NA
like image 166
Frank Avatar answered Jan 20 '26 16:01

Frank