如何用purrr对列表中每个元素应用round函数而非整个列表?
解决方法:对列表中每个向量的每个元素应用逐元素处理
你的问题出在这一步:map(~ round(max(.x, 0), 0)) 里的 max(.x, 0) 是取整个向量的最大值(而非每个元素和0比较取较大值),再取整后自然每个列表项就变成了单个数值。
要实现和非purrr版本(sapply逐个处理元素)一致的效果,有两种简洁的处理方式:
方法1:嵌套map,逐个遍历元素
每个列表项是长度为104的向量,我们可以在第二个map里再嵌套一层map_dbl(确保输出数值向量),对向量里的每个元素执行round(max(x, 0), 0):
library(purrr) library(tidyverse) 1:3 %>% map(~ rnorm(104, .x)) %>% map(~ map_dbl(.x, ~ round(max(.x, 0), 0)))
执行后每个列表元素会变成长度104的向量,每个元素都是原数值和0取大后取整的结果。
方法2:利用向量化函数(更高效)
其实max的向量化版本是pmax,它能逐元素比较向量和标量(这里是0),所以我们不需要嵌套循环,直接用pmax替代max就能一次性处理整个向量:
1:3 %>% map(~ rnorm(104, .x)) %>% map(~ round(pmax(.x, 0), 0))
这个方法更高效,因为直接利用了R的向量化运算特性,结果和方法1完全一致,代码也更简洁。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

