![](/img/trans.png)
[英]replace loops with apply family functions (or dplyr), using logical functions in R
[英]In R, apply a sequence of complex functions using the “do” function in dplyr
我想知道如果可以使用管道链接应用一系列特殊函数。 例如,假设我在group_var中有3个级别的以下数据:
head(df)
v1 v2 .... v9 group_var
1 2 0 1
5 3 2 0
2 1 3 1
1 8 9 2
7 6 0 1
5 9 2 0
我的第一个问题:我希望做到以下几点
res<- df %>% group_by(group_var) %>% do( out = special_function(.) )
其中特殊功能具有每组不同的组件功能。 也就是说,在伪代码中,特殊功能是
special_function = (f0,f1,f2)
所以f1,f2,f3是相互不同的。 例如
f0<- function(data) apply(data, 2, min)
f1<- function(data) t(data)
f2<- function(data) as.list(data)
和
df[df$group_var == i ,]
是每个i = 0,1,2的fi函数的输入。 那是
res$out[[1]] == f0(df[df$group_var == 0 ,])
> T
res$out[[2]] == f0(df[df$group_var == 1 ,])
> T
res$out[[3]] == f0(df[df$group_var == 2 ,])
> T
我的第二个问题与我的第一个问题有关。 如果第一个问题的答案是肯定的,我想申请更多的操作。 实际上,我想使用每个fi的输出并应用与其他相关的操作。 例如
other_special_function<- function(d1,d2,d3)
{
ret<- cbind(d1 , d2)
ret2<- cbind(ret, apply(d,2,sum))
return(ret2)
}
res2<- res %>% do(out2 = other_special_function(.) )
哪一个
res2$out2 = other_special_function(res$out[[1]], res$out[[2]] , res$out[[3]] )
你绝对可以用管道和功能做到这一点; 它非常灵活。 如果你有一个可能更复杂的函数,正如你所描述的那样,我建议使用purrr和map()
而不是dplyr中的do()
。
假设你拥有每个人最喜欢的虹膜数据集。 您可以从tidyr使用nest()
开始,这样每个组就有一行,数据嵌套在list-column中的迷你数据帧中。
library(dplyr)
library(tidyr)
iris %>%
nest(-Species)
#> # A tibble: 3 × 2
#> Species data
#> <fctr> <list>
#> 1 setosa <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica <tibble [50 × 4]>
然后说你有一些任意函数想要应用于每个小的迷你数据帧,它根据物种的不同而不同。 这可能会像你喜欢的那样复杂。
fun <- function(df, species) {
if (species == "setosa") {
t(df)
} else {
df
}
}
您可以使用purrr中的map2()
将此函数应用于每个物种/数据对,您可以将其放在数据框的新列中,如果您愿意,可以继续使用。
library(purrr)
iris %>%
nest(-Species) %>%
mutate(output = map2(data, Species, fun))
#> # A tibble: 3 × 3
#> Species data output
#> <fctr> <list> <list>
#> 1 setosa <tibble [50 × 4]> <dbl [4 × 50]>
#> 2 versicolor <tibble [50 × 4]> <tibble [50 × 4]>
#> 3 virginica <tibble [50 × 4]> <tibble [50 × 4]>
这是一种将任意操作应用于数据的灵活技术,尤其适用于建模 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.