【发布时间】:2019-03-02 15:06:46
【问题描述】:
我正在尝试了解 pmap 的工作原理。下面的小标题包含一个列表列values。我想创建一个新列New,这取决于values 列中的相应元素是否为NULL。由于 is.null 没有矢量化,我最初想在遇到pmap() 之前使用rowwise()。
在mutate() 之前使用rowwise() 可以得到所需的结果,如下所示:
tbl = as.data.frame(do.call(rbind, pars)) %>%
rowwise() %>%
mutate(New = ifelse(is.null(values), paste(id, default), paste(id, values, collapse=", ")))
> tbl
Source: local data frame [2 x 6]
Groups: <by row>
# A tibble: 2 x 6
id lower upper values default New
<list> <list> <list> <list> <list> <chr>
1 <chr [1]> <dbl [1]> <dbl [1]> <NULL> <dbl [1]> a 5
2 <chr [1]> <NULL> <NULL> <list [3]> <chr [1]> b 0, b 1, b 2
但是,pmap() 没有:
tbl = as.data.frame(do.call(rbind, pars)) %>%
mutate(New = pmap(., ~ifelse(is.null(values), paste(id, default), paste(id, values, collapse=", "))))
> tbl
id lower upper values default New
1 a 1 10 NULL 5 a NULL, b list("0", "1", "2")
2 b NULL NULL 0, 1, 2 1 a NULL, b list("0", "1", "2")
如果我使用匿名函数代替波浪号,它似乎可以工作:
tbl = as.data.frame(do.call(rbind, pars)) %>%
mutate(Value = pmap(., function(values, default, id, ...) ifelse(is.null(values), paste(id, default), paste(id, values, collapse=", "))))
> tbl
id lower upper values default Value
1 a 1 10 NULL 5 a 5
2 b NULL NULL 0, 1, 2 1 b 0, b 1, b 2
但我不明白为什么波浪号版本会失败?我宁愿不必完整指定参数,因为我需要将函数映射到多个列。我哪里错了?
【问题讨论】:
-
您能否为上述内容添加一个可重现的示例,以便于提供帮助?我们没有
pars开始的对象。
标签: r vectorization data-manipulation purrr pmap