如何使用purrr :: map实现行式迭代?
这是我用标准行方式应用的方法.
df <- data.frame(a = 1:10, b = 11:20, c = 21:30)
lst_result <- apply(df, 1, function(x){
var1 <- (x[['a']] + x[['b']])
var2 <- x[['c']]/2
return(data.frame(var1 = var1, var2 = var2))
})
Run Code Online (Sandbox Code Playgroud)
但是,这不是太优雅,我宁愿用purrr来做.可能(也可能不会)更快.
aos*_*ith 37
您可以使用pmap行式迭代.这些列用作您正在使用的任何函数的参数.在您的示例中,您将具有三参数函数.
例如,这里pmap使用匿名函数来处理您正在进行的工作.列按照它们在数据集中的顺序传递给函数.
pmap(df, function(a, b, c) {
data.frame(var1 = a + b,
var2 = c/2)
} )
Run Code Online (Sandbox Code Playgroud)
您可以使用purrr tilde"short-hand"作为匿名函数,方法是按顺序引用列,前面有两个点.
pmap(df, ~data.frame(var1 = ..1 + ..2,
var2 = ..3/2) )
Run Code Online (Sandbox Code Playgroud)
如果要将这些特定结果作为data.frame而不是列表获取,则可以使用pmap_dfr.
请注意,您在示例中仅使用向量化操作,因此您可以做到:
df %>% dplyr::transmute(var1 = a+b,var2 = c/2)
Run Code Online (Sandbox Code Playgroud)
(或者在基R: transform(df,var1 = a+b,var2 = c/2)[4:5])
如果您使用非矢量化函数(如中位数),您可以使用pmap@aosmith的答案,或使用dplyr::rowwise.
rowwise我觉得我读包维护者想要远离它并且让人们使用map家庭代替,但是它更容易在眼睛上pmap使用,因为我在速度不是问题时使用它:
library(dplyr)
df %>% transmute(var3 = pmap(.,~median(c(..1,..2,..3))))
df %>% rowwise %>% transmute(var3 = median(c(a,b,c)))
Run Code Online (Sandbox Code Playgroud)
(回去了严格的无名列表输出:res %>% split(seq(nrow(.))) %>% unname)
您可以结合使用pmap和 ,...这对我来说是最好的解决方案,因为我不需要指定参数。
df <- data.frame(a = 1:10, b = 11:20, c = 21:30)
lst_result <- df %>%
pmap(function(...) {
x <- tibble(...)
return(tibble(var1 = x$a + x$b, var2 = x$c/2))
})
Run Code Online (Sandbox Code Playgroud)
您可以随时围绕您“喜欢”的功能进行包装。
rmap <- function (.x, .f, ...) {
if(is.null(dim(.x))) stop("dim(X) must have a positive length")
.x <- t(.x) %>% as.data.frame(.,stringsAsFactors=F)
purrr::map(.x=.x,.f=.f,...)
}
Run Code Online (Sandbox Code Playgroud)
应用新功能rmap([R owwise图)
rmap(df1,~{
var1 <- (.x[[1]] + .x[[2]])
var2 <- .x[[3]]/2
return(data.frame(var1 = var1, var2 = var2))
})
Run Code Online (Sandbox Code Playgroud)
附加信息:(从上到下评估)
df1 <- data.frame(a=1:3,b=1:3,c=1:3)
m <- matrix(1:9,ncol=3)
apply(df1,1,sum)
rmap(df1,sum)
apply(m,1,sum)
rmap(m,sum)
apply(1:10,1,sum) # intentionally throws an error
rmap(1:10,sum) # intentionally throws an error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10730 次 |
| 最近记录: |