gpt4 book ai didi

r - 对 R 中的 map 函数感到困惑

转载 作者:行者123 更新时间:2023-12-01 10:17:48 29 4
gpt4 key购买 nike

我用 purrr 库在 R 中编写了以下内容。好吧,它开始变得更加复杂,但是在尝试了 20 次之后,我将其简化为基本知识,以了解发生了什么。

map(list(1:60), function(a) { 
if (a < 2) {
return(1)
} else {
return(0)
}})
[[1]]
[1] 1

Warning message:In if (a < 2) { :

the condition has length > 1 and only the first element will be used


预期结果是一个列表,其中前两个元素的值是 1,其余元素的值是 0。
这里发生了什么?

最佳答案

如果我们把它放在 list ,它将被视为一个单元

library(purrr)
map(1:60, ~ if(.x > 2) 1 else 0)

请注意 ~tidyverse 中的一种紧凑方式用于匿名函数调用 ( function(x) if(x > 2) 1 else 0 )

或者,如果我们正在创建一个 list 60 个元素,然后 as.list会很有用
map(as.list(1:60), ~ if(.x > 2) 1 else 0)

为此,我们不需要循环,因为它可以是 unlist ted 并简单地与 2 进行比较( > )以创建逻辑 vector可以使用 as.integer 强制转换为二进制或 ( + - 转换 TRUE -> 1, FALSE -> 0)
+(unlist(as.list(1:60)) > 2)

如果输出需要是 list , 用 as.list 包裹
as.list(+(unlist(as.list(1:60)) > 2))

在 OP 的代码中,发生的事情是
list(1:60)
#[[1]]
#[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
#[43] 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

输入是 list只有单个元素具有 length共 60 个。与 map ,它遍历那个单个元素,但是 if/else未矢量化

根据 ?Control ,用法是

if(cond) cons.expr else alt.expr



在哪里

cond - A length-one logical vector that is not NA. Conditions of length greater than one are currently accepted with a warning, but only the first element is used. An error is signalled instead when the environment variable



这导致 warning消息即 if/else预计 list元素具有 length只是 1。相反,我们可以使用 ifelse这是矢量化的
map(list(1:60), ~ ifelse(.x > 2, 1, 0))
#[[1]]
#[1] 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

或者只是提取 list元素
ifelse(list(1:60)[[1]] > 2, 1, 0)

关于r - 对 R 中的 map 函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59480977/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com