Условно выбираем позиции элементов объектов в списке и возвращаем новый список с позициями элементов объекта - PullRequest
3 голосов
/ 11 марта 2020

У меня есть список многих объектов; в случае этого MWE - только 6. Меня интересует выбор позиции элемента для объектов msfr, msfl, mshr и mshl, которые соответствуют соответствующему значению в vms (этот объект содержит максимальное значение элементов в объектах 'ms ...') и где scheduled.day соответствует `day. Моя цель - вернуть второй список объектов (объекты «ms ...»), в которых хранится положение элементов, где условия выполняются. Вот данные:

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)

Самое близкое к достижению моей цели - следующий код. Но с помощью %in% позиции элемента возвращаются для объекта 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

Я ищу некий аккуратный код, который будет возвращать список, который выглядит следующим образом.

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

> l3
$msfr
[1] 2

$mshl
[1] 5

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Другой вариант - преобразовать его в data.frame, затем сделать group по подмножеству, чтобы вернуть индекс summarised и, наконец, преобразовать в 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
1 голос
/ 11 марта 2020

Я должен быть слепым!

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

Я не знаю, почему я не пробовал это раньше, но это помогает. Если у кого-нибудь есть альтернативное решение, я был бы рад его увидеть.

...