R 有条件地选择列表中对象的元素位置,并返回包含对象元素位置的新列表
我有许多物品的清单;在本MWE的情况下-仅6。我感兴趣的是为对象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),
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