r-有条件地选择列表中对象的元素位置,并返回带有对象元素位置的新列表



我有一个包含许多对象的列表;在这种MWE的情况下,仅为6。我感兴趣的是为对象msfrmsflmshrmshl选择元素的位置,这些对象对应于vms中的相应值(该对象保持"ms…"对象中元素的最大值(,其中scheduled.day对应于"day"。我的目标是返回第二个对象列表("ms…"对象(,其中包含条件为true的元素的位置。数据如下:

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)

我最接近实现目标的是使用以下代码。但是通过使用CCD_ 7,为对象CCD_。

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

我一定是盲人!

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

我不知道为什么我以前没有尝试过,但它确实有效。如果有人有其他解决方案,我会很高兴看到它。

另一个选项是将其转换为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

最新更新