繁体   English   中英

在R中,使用dplyr中的“do”函数应用一系列复杂函数

[英]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,2fi函数的输入。 那是

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM