R 有条件地选择列表中对象的元素位置,并返回包含对象元素位置的新列表

R 有条件地选择列表中对象的元素位置,并返回包含对象元素位置的新列表,r,list,lapply,R,List,Lapply,我有许多物品的清单;在本MWE的情况下-仅6。我感兴趣的是为对象msfr、msfl、mshr和mshl选择元素的位置,这些对象对应于vms中的相应值(此对象保存“ms..”对象中元素的最大值),其中预定的.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),

我有许多物品的清单;在本MWE的情况下-仅6。我感兴趣的是为对象
msfr
msfl
mshr
mshl
选择元素的位置,这些对象对应于
vms
中的相应值(此对象保存“ms..”对象中元素的最大值),其中
预定的.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)
我要寻找的是一些整洁的代码,它将返回一个如下所示的列表

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

> l3
$msfr
[1] 2

$mshl
[1] 5
l3
$msfr
[1] 2
$mshl
[1] 5
我一定是瞎了

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

我不知道为什么我以前没有试过这个,但它确实奏效了。如果有人有其他解决方案,我很乐意看到。

另一个选项是将其转换为
数据.frame
,然后按子集进行
分组
,返回
摘要
索引,最后转换为
列表

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

谢谢这是你两天来第二次回答我的问题。干杯,伙计!
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