简体   繁体   中英

Looping dataset R

I'm trying to make a loop to automate a lot of actions in R. The code I have looks like this:

  datA <- droplevels(datSUM[datSUM$Conc=="a",])
  datB <- droplevels(datSUM[datSUM$Conc=="b",])
  datC <- droplevels(datSUM[datSUM$Conc=="c",]) 
  datD <- droplevels(datSUM[datSUM$Conc=="d",])
  datE <- droplevels(datSUM[datSUM$Conc=="e",])
  datX <- droplevels(datSUM[datSUM$Conc=="x",])
  datY <- droplevels(datSUM[datSUM$Conc=="y",])


  datAf <- droplevels(datA[datA$Sex=="f",])
  datAf1 <- droplevels(datAf[datAf$rep=="1",])
  datAf2 <- droplevels(datAf[datAf$rep=="2",])
  datAf3 <- droplevels(datAf[datAf$rep=="3",])

  datAm <- droplevels(datA[datA$Sex=="m",])
  datAm1 <- droplevels(datAm[datAm$rep=="1",])
  datAm2 <- droplevels(datAm[datAm$rep=="2",])
  datAm3 <- droplevels(datAm[datAm$rep=="3",])

So since I have to do this 7 times, it seems like making a loop for this operation is the best way to do it. Can someone help me make that? I'm new to R so please bear that in mind.

Well I will have a stab at this.

concs <- c(a='a',b='b',c='c',d='d',e='e',x='x',y='y')
sex <- c(m='m',f='f')
reps <- c(rep1='1',rep2='2',rep3='3')
# By using m='m' we can label the objects within the list, making it
# easier to navigate the final object, otherwise use:
# concs <- c('a','b','c','d','e','x','y')
# sex <- c('m','f')
# reps <- c('1','2','3')

dfs   <- lapply(concs, function(x){
                droplevels(datSUM[datSUM$Conc==x,])}
                )

sdfs  <- lapply(sex, function(x){
                lapply(dfs, function(y){
                       droplevels(y[y$Sex==x,])}
                       )}
                )

rsdfs <- lapply(reps, function(x){
                lapply(sdfs, function(y){
                       lapply(y, function(z){
                              droplevels(z[z$rep==x,])}
                              )}
                       )}
                )    

There is probably a better way to do this, that may involve using more lapply s but I think this "should" do the trick.

The only downside to this method you will have to access certain objects with rsdfs[[1]][[1]][[1]] or rsdfs[['rep1']][['m']][['a']] etc

And applying functions to these would in itself require a bunch of lapply s

Let me know if this helps.

This is one method to do so - I will work on a more elegant solution later.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM