R语言 强制lapply/sapply对包含输入的输出列表进行索引

jv4diomz  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(119)

如标题所示,如何强制lapply或sapply使用输入向量值来索引输出。我有两个案子让我从简单的开始。下面的代码

lapply(c('a', 'b'), function(idx){
    rnorm(1)
})

给我输出

[[1]]
[1] -1.359386

[[2]]
[1] -0.3428958

但我想收到

$a
[1] -1.359386

$b
[1] -0.3428958

在最终目标中,我的代码看起来如下所示:

m = sapply(unique(isotopes[, 1]), function(el){
    sapply(isotopes[isotopes$element == el, 2], function(mnr){
        isotopes[isotopes$element == el & isotopes$mass_nr == mnr, 3]
    })
})

它给我的输出是

$Pu
[1] 238.0496 239.0522 240.0538 241.0569 242.0587 244.0642

而我想获得列表的列表,能够使用m['Pu'][240]m['Pu']['240']等。(对于'Pu' isotopes[isotopes$element == el, 2]是238 239 240 241 242 244的向量)
附言当然我可以用

m = function(el, mnr){ isotopes[isotopes$element == el & isotopes$mass_nr == mnr, 3] }

但我很感兴趣,如果上述问题拥有一个整洁的解决方案:)

2wnc66cl

2wnc66cl1#

你可以试试

lapply(c(a = "a", b = "b"), function(idx) {
    rnorm(1)
})

它应该能给予所需的输出

$a
[1] 1.556433

$b
[1] -0.2282002
mfpqipee

mfpqipee2#

如果你想分割数据集两次,使用split两次,它返回一个命名列表。
在下面的代码中,我使用了列名third_col,而不是列号。

set.seed(2023)
n <- 20L
isotopes <- data.frame(
  element = sample(letters[1:2], n, TRUE),
  mass_nr = sample(3, n, TRUE),
  third_col = rnorm(n)
)

sp <- split(isotopes, isotopes$element) 
lapply(sp, \(x) split(x$third_col, x$mass_nr))
#> $a
#> $a$`1`
#> [1]  0.8602705 -0.1299832  0.1092238  0.1615685 -1.5131984  1.1431521
#> 
#> $a$`2`
#> [1] -0.4709085 -0.4389865 -1.1927195 -1.1326977
#> 
#> $a$`3`
#> [1]  0.8468178 -1.3264019  0.9712922
#> 
#> 
#> $b
#> $b$`1`
#> [1] 1.9957190 0.1108168
#> 
#> $b$`2`
#> [1]  0.7522100  0.9254184 -0.2917223
#> 
#> $b$`3`
#> [1] -0.2294296 -0.7137467

创建于2023-09-20使用reprex v2.0.2
或者使用从第一个splitlapply/split的管道。然后提取几个命名列表成员。

m <- split(isotopes, isotopes$element) |> lapply(\(x) split(x$third_col, x$mass_nr))

m$a[['2']]
#> [1] -0.4709085 -0.4389865 -1.1927195 -1.1326977

m$b$`3`
#> [1] -0.2294296 -0.7137467

创建于2023-09-20使用reprex v2.0.2

m3eecexj

m3eecexj3#

另一种方法-使用sapply()simplify = FALSE选项来获得一个列表作为输出:

sapply(c('a', 'b'), \(idx) rnorm(1), simplify = FALSE)

输出量:

$a
[1] 0.4824588

$b
[1] 0.7582138

相关问题