如果我们把它放在
list
里,它将被视为一个单元。
library(purrr)
map(1:60, ~ if(.x > 2) 1 else 0)
请注意,在
tidyverse
中,
~
是匿名函数调用的一种简洁方式(
function(x) if(x > 2) 1 else 0
)。
或者如果我们正在创建包含60个元素的list
,那么as.list
会非常有用。
map(as.list(1:60), ~ if(.x > 2) 1 else 0)
为此,我们不需要循环,因为可以使用“unlist”并仅使用2进行比较(>),以创建逻辑向量,该向量可以通过as.integer转换为二进制或(+ -将TRUE-> 1,FALSE-> 0)
+(unlist(as.list(1:60)) > 2)
如果输出需要是一个列表
,则使用as.list
进行包装。
as.list(+(unlist(as.list(1:60)) > 2))
在楼主的代码中,发生了什么事情是这样的:
list(1:60)
输入是一个只有单个元素的列表,该元素具有长度为60。使用map
对该单个元素进行循环,但if/else
不是矢量化的。
根据?Control
,使用方法如下:
if(cond) cons.expr else alt.expr
其中
cond - 长度为1且不为NA的逻辑向量。长度大于1的条件目前被接受并带有警告,但仅使用第一个元素。当环境变量为时,会发出错误信号
这导致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)
+(1:60<2)
会给您相同的输出。 - Ronak Shah