简体   繁体   中英

Conditionally select element positions of objects in list and return new list with object element positions

I have a list of many objects; in the case of this MWE - only 6. I am interested in selecting the position of an element for objects msfr , msfl , mshr and mshl which correspond to the respective value in vms (this object holds the maximum value of the elements in the 'ms...' objects) and where scheduled.day corresponds with `day. My objective is to return a second list of objects (the 'ms...' objects) holding the position of the elements where the conditions are true. Here is the data:

l <- list(msfr=c(1,5,0,0,0),
          msfl=c(1,4,0,5,0),
          mshr=c(1,0,0,0,0),
          mshl=c(0,0,0,0,4),
          vms= c(1,5,0,5,4),
          scheduled.day = c(0, 3, 0, 4, 3)) 
today <- 3
ctt<- which(l[["scheduled.day"]] == today)

The closest I have come to achieving my objective is with the following code. But by using %in% element positions are being returned for the object msfl .

obj.names <-  names(l)[1:4]
l2 <- lapply(lapply(l[obj.names],"["), function(x){which(x %in% l[["vms"]][ctt])}) # ctt being ignored

> l2
$msfr
[1] 2

$msfl
[1] 2 4

$mshr
integer(0)

$mshl
[1] 5

What I am looking for is some neat code that will return a list that looks like this.

l3 <- list(msfr = 2,
           mshl = 5)

> l3
$msfr
[1] 2

$mshl
[1] 5

I must be blind!

lapply(lapply(l[obj.names],"["), function(x){which(x == l[["vms"]] & l[["scheduled.day"]] == today)})

I don't know why I didn't try this before, but it does the trick. If anyone has an alternative solution, I would be glad to see it.

Another option is to convert it to data.frame , then do a group by subset to return a summarised index and finally convert to list

library(tibble)
library(dplyr)
library(tidyr)
enframe(l[obj.names]) %>%
     unnest(c(value)) %>%
     group_by(name) %>% 
     summarise(rn = list(row_number()[value ==l[['vms']] & l[["scheduled.day"]] == today])) %>%
     unnest(c(rn)) %>%
     deframe %>% 
     as.list
#$msfr
#[1] 2

#$mshl
#[1] 5

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