我创建了许多数据格式,如下所示:
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.
也许我应该用我想要过滤的变量定义和数组,然后命名这个数组?
任何想法都不受欢迎!
提前谢谢。
发布于 2017-09-25 18:15:21
因为您的过滤器似乎并不是相互排斥的(也就是说,一个数据点可以在多个筛选组中),所以我认为您最好的选择是为您的过滤器生成一个向量,然后遍历该向量(尽管我将使用lapply而不是for循环)。
由于您没有提供可重复的数据集或您所使用的过滤器的概念,所以我将只使用内置的iris数据和按物种分组(代码将同样适用于多个分组变量)。
首先,下面是一组过滤器:
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的平均值,因为这似乎与您的用例相匹配。
irisSummaries <-
irisFilters %>%
lapply(function(thisFilter){
iris %>%
filter(!! thisFilter) %>%
group_by(Species) %>%
summarise(Petal.Length = mean(Petal.Length))
})这将返回一个列表,其中包含与每个条件相匹配的汇总结果,如下所示:
$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然后,可以使用分配给它们的名称(在创建筛选向量时)将它们组合到单个表中作为标识符:
longSummaries <-
irisSummaries %>%
bind_rows(.id = "Filter")返回:
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为每个过滤器创建一个列:
wideSummaries <-
longSummaries %>%
spread(Filter, Petal.Length)返回:
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代码应该对任意数量的筛选器、您选择的任何名称、任意数量的分组变量(或组)都具有鲁棒性。如果您返回多个变量,则需要更多的注意,不过在这种情况下,宽格式可能是不可取的。
https://stackoverflow.com/questions/46402421
复制相似问题