首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr在dplyr/函数上循环

使用dplyr在dplyr/函数上循环
EN

Stack Overflow用户
提问于 2017-09-25 09:58:34
回答 1查看 2K关注 0票数 0

我创建了许多数据格式,如下所示:

df <- data %>% select(var1,var2,var3,var4) %>% group_by(var3,var4) %>% filter(var2 ==1) %>% summarise(var1 = mean(var1))

每个数据的输出是var1的平均值,通过var3和var4对变量进行分组,并根据不同的变量对其进行过滤。

与我在上面提供的数据和代码中的其余部分的唯一区别是过滤变量。

因为我想要一个很好的表来显示我的输出,所以我使用left_join来按我想要的方式合并和排列数据。

虽然我已经完成了我的分析并得到了我想要的输出.

我必须使用许多其他变量过滤变量,最后我创建了大约20个数据格式。

所以我的问题是:

是否有其他方法可以同时使用函数或循环创建所有这些数据帧?类似于:

dfi<- ....for i在1-20.

也许我应该用我想要过滤的变量定义和数组,然后命名这个数组?

任何想法都不受欢迎!

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 18:15:21

因为您的过滤器似乎并不是相互排斥的(也就是说,一个数据点可以在多个筛选组中),所以我认为您最好的选择是为您的过滤器生成一个向量,然后遍历该向量(尽管我将使用lapply而不是for循环)。

由于您没有提供可重复的数据集或您所使用的过滤器的概念,所以我将只使用内置的iris数据和按物种分组(代码将同样适用于多个分组变量)。

首先,下面是一组过滤器:

代码语言:javascript
复制
irisFilters <-
  c(Long = quote(Sepal.Length > 6 | Petal.Length > 4)
    , Wide = quote(Sepal.Width > 3 | Petal.Width > 1.5)
    , Boxy = quote((Sepal.Width / Sepal.Length) > 0.5)
  )

请注意,这些都是完全武断的(可能根本没有意义),但它们应该让您了解什么是可能的。重要的是,我使用quote并不是为了以后可以将它们传递到filter步骤中。

然后,使用lapply逐步遍历每个筛选条件,使用!!告诉dplyr解释变量中的内容。在这里,我只是采取Petal.Length的平均值,因为这似乎与您的用例相匹配。

代码语言:javascript
复制
irisSummaries <-
  irisFilters %>%
  lapply(function(thisFilter){
    iris %>%
      filter(!! thisFilter) %>%
      group_by(Species) %>%
      summarise(Petal.Length = mean(Petal.Length))
  })

这将返回一个列表,其中包含与每个条件相匹配的汇总结果,如下所示:

代码语言:javascript
复制
$Long
# A tibble: 2 x 2
     Species Petal.Length
      <fctr>        <dbl>
1 versicolor     4.502857
2  virginica     5.552000

$Wide
# A tibble: 3 x 2
     Species Petal.Length
      <fctr>        <dbl>
1     setosa     1.480952
2 versicolor     4.730000
3  virginica     5.572340

$Boxy
# A tibble: 3 x 2
     Species Petal.Length
      <fctr>        <dbl>
1     setosa     1.462000
2 versicolor     4.290909
3  virginica     5.320000

然后,可以使用分配给它们的名称(在创建筛选向量时)将它们组合到单个表中作为标识符:

代码语言:javascript
复制
longSummaries <-
  irisSummaries %>%
  bind_rows(.id = "Filter")

返回:

代码语言:javascript
复制
  Filter    Species Petal.Length
   <chr>     <fctr>        <dbl>
1   Long versicolor     4.502857
2   Long  virginica     5.552000
3   Wide     setosa     1.480952
4   Wide versicolor     4.730000
5   Wide  virginica     5.572340
6   Boxy     setosa     1.462000
7   Boxy versicolor     4.290909
8   Boxy  virginica     5.320000

然后可以使用spread为每个过滤器创建一个列:

代码语言:javascript
复制
wideSummaries <-
  longSummaries %>%
  spread(Filter, Petal.Length)

返回:

代码语言:javascript
复制
     Species     Boxy     Long     Wide
*     <fctr>    <dbl>    <dbl>    <dbl>
1     setosa 1.462000       NA 1.480952
2 versicolor 4.290909 4.502857 4.730000
3  virginica 5.320000 5.552000 5.572340

代码应该对任意数量的筛选器、您选择的任何名称、任意数量的分组变量(或组)都具有鲁棒性。如果您返回多个变量,则需要更多的注意,不过在这种情况下,宽格式可能是不可取的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46402421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档