vendredi 8 octobre 2021

Randomly sampling if greater than in R, list of dataframes

I have a list of dataframes, the first dataframe looks like this:

> head(allyears_dom_order[[1]],10)
SiteName survey1 survey2 survey3 survey4 survey5 survey6 survey7 survey8 survey9 survey10 survey11 survey12 survey13 survey14 survey15 survey16 survey17 survey18 survey19 survey20
1         1      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
2         2      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
3         3      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
4         4      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
5         5      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
6         6      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
7         7      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
8         8      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
9         9      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA
10       10      NA      NA      NA      NA      NA      NA      NA      NA      NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA

Each dataframe has the same number of rows but different number of columns (max is something in the 600s). I also have the following list which contains the number of non-NA elements for each row in each dataframe:

rowsums <- foreach(i=1:13) %do% {
  allyears_dom_order[[i]] %>% 
    select(2:ncol(.)) %>% 
    is.na %>% 
    `!` %>% 
    rowSums

> rowsums[[1]]
   [1]  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  1  1  0  0 16  3  5  0  3  0  0  0  0  0  0  0  3  0  1  0  0  0  2  1
  [60]  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  3  0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  2  2  3 12  1  0  0  0  0  5 48

I want to create a new list of dataframes, where the number of columns (surveys) is capped at 50. So if the rowsums is greater than 50, I want to randomly sample 50 of those non-NA elements in that row and put it in a new dataframe. Im thinking something like this:

for(i in 1:nrow(allyears_dom_order[[1]])){
  for (t in 1:13){
    if (rowsums[i,t] > 50){
      all<-allyears_dom_order[[t]][i,]
      all50<-sample(all,50,replace=FALSE)

    }
  }
}

But this wouldn't work, since the all would contain NAs and I don't want to randomly sample them, only those with non-NA.




Aucun commentaire:

Enregistrer un commentaire