我有一个包含许多对象的列表;在这种MWE的情况下,仅为6。我感兴趣的是为对象msfr
、msfl
、mshr
和mshl
选择元素的位置,这些对象对应于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