使用列表简化R中的代码 背景:
大家好 我希望你能帮助我将我的理解和代码提升到一个新的水平。我正试着将我的头脑集中在列表上,它们的优点,并使用它们来减少冗余代码。虽然我在网上读了很多关于列表和应用族的信息,但我仍然不知道如何在日常工作中实施 这是一种我认为可以大大简化的情况——这是我经常编写的代码类型,我希望用更简洁的格式来替换它 例子: 让我们假设整个使用列表简化R中的代码 背景:,r,list,vector,functional-programming,programmatically,R,List,Vector,Functional Programming,Programmatically,大家好 我希望你能帮助我将我的理解和代码提升到一个新的水平。我正试着将我的头脑集中在列表上,它们的优点,并使用它们来减少冗余代码。虽然我在网上读了很多关于列表和应用族的信息,但我仍然不知道如何在日常工作中实施 这是一种我认为可以大大简化的情况——这是我经常编写的代码类型,我希望用更简洁的格式来替换它 例子: 让我们假设整个mtcars数据是针对一个观察年,比如2018年。让我们假设每年都有2000年的数据。现在有了“18”个mtcars data.frames,其中有一个年份列,表示年份,我们将
mtcars
数据是针对一个观察年,比如2018年。让我们假设每年都有2000年的数据。现在有了“18”个mtcars data.frames,其中有一个年份列,表示年份,我们将18个观测值按行绑定到单个data.frames中。这是我现在处理的数据类型的一个示例。按年份分开的观察结果
data <- mtcars %>%
group_by(date) %>%
mutate(rank = dense_rank(desc(mpg))
))
并将每个秩组的输出存储到一个列表中,然后在ggplot中绘制所有这些列表
任何帮助或建议都将不胜感激,我正在努力改进我的比赛 学习以整洁的方式处理列表和列表列可能有点复杂。我非常推荐珍妮·布莱恩的
purr
。在这里,您试图避免多次对年份
、档位
和等级
的不同值进行筛选。有几个步骤:
找出如何获得所需值的所有组合。我们在这里使用purrr::cross_df
实现这一点,这是获取变量组合的一种非常方便的方法
实际运行每个组合的操作。因为我们的数据现在已经被很好地设置为每一行都是一组输入,所以我们可以使用pmap
将每个过滤后的数据集存储为一个列表元素。根据我们想要的绘图,我们可以使用其他工具,如unest
,将数据转换为我们想要绘图的格式
我希望这可以说明,一般来说,如果你意识到你做了太多的事情,基本上有两个步骤;创建一个或多个可迭代的列表,并使用map
函数将所需操作应用于每个列表元素
库(tidyverse)
数据%
绑定行(
mtcars%>%突变(年份=2005),
mtcars%>%突变(2006年)
) %>%
组别(年份)%>%
变异(秩=密集秩(描述(mpg)))
组合%
变异(
rank_range=map(开始,~.x:(.x+4)),
过滤=pmap(
.l=列表(年份、档位、等级范围),
.f=~数据%>%
过滤器(档位==…2,年份==…1)%>%
过滤器(在%中排名%3)
)
)
#>#A tible:120 x 5
#>年份档位开始档位范围已过滤
#>
#> 1 2005 3 1
#> 2 2006 3 1
#> 3 2005 4 1
#> 4 2006 4 1
#> 5 2005 5 1
#> 6 2006 5 1
#> 7 2005 3 6
#> 8 2006 3 6
#> 9 2005 4 6
#> 10 2006 4 6
#> # ... 还有110行
由(v0.2.0)于2018年5月14日创建。您所问的问题非常广泛,即,总体而言,如何减少代码的冗余?在过滤的特定情况下,我的策略是创建“助手”数据帧,这些数据帧可以连接到主数据帧。例如,您可能有一个包含列year
、min
和max
的数据框,按“年”将其连接到mtcars
,然后filter(mtcars,year>=min&year)您应该查找拆分而不是筛选的函数。
data %>%
filter(gear == 4, date == '2005') %>%
filter(rank %in% seq(1, 100, by = 5))