使用列表简化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))