在函数中使用Dplyr创建新数据框

Cli*_*ers 0 r dplyr

我正在尝试使用R 3.2.2从dplyr 0.4.3函数创建新的数据框。

我想做的是使用dplyr :: filter创建一些新的数据帧,以将数据从一个巨大的数据帧中分离为一堆较小的数据帧。

对于可重现的基本案例沼泽简单示例,我使用了以下示例:

filter(mtcars, cyl == 4)
Run Code Online (Sandbox Code Playgroud)

我知道我需要将其分配给它自己的数据框,因此我从以下内容开始:

paste("Cylinders:", x, sep = "") <- filter(mtcars, cyl == 4))
Run Code Online (Sandbox Code Playgroud)

那没有用-它给了我在这里发现的错误:赋值扩展为非语言对象

从那里,我发现了这一点:在R中使用粘贴创建变量名

(也是上述作者的大事)

这使我想到了这一点,它起作用了:

assign(paste("gears_cars_cylinders", 4, sep = "_"), filter(mtcars, cyl == 4)) %>% 
    group_by(gear) %>% 
    summarise(number_of_cars = n())
Run Code Online (Sandbox Code Playgroud)

通过“工作”,我的意思是我得到一个名为gears_cars_cylinders_4的数据框,其中包含来自

filter(mtcars, cyl == 4) %>% 
        group_by(gear) %>% 
        summarise(number_of_cars = n())
Run Code Online (Sandbox Code Playgroud)

但最终,我认为我需要将整个东西包装到一个函数中,并能够将其的柱面数提供给它mtcars$cyl。我在想什么plyr::ldply(mtcars$cyl, function_name)

在我的实际数据中,我需要分解大约70个不同的类,以分成单独的数据框,然后放入DT::datatableShiny中的选项卡,这真是一团糟。无论如何。

当我尝试这个:

    function_name <- function(x){
    assign(paste("gears_cars_cylinders", x, sep = "_"), filter(mtcars, cyl == x)) %>% 
        group_by(gear) %>% 
        summarise(number_of_cars = n())
}
Run Code Online (Sandbox Code Playgroud)

然后function_name(6)

我将数据框的输出输出到屏幕上,但没有将名称输出到数据框。

我在寻找答案吗?

jen*_*yan 5

您需要将新的数据帧分配到要从其调用的环境中function_name()。尝试这样的事情:

library(dplyr)

foo <- function(x) {
  assign(paste("gears_cars_cylinders", x, sep = "_"),
         envir = parent.frame(),
         value = mtcars %>% 
           filter(cyl == x) %>% 
           count(gear))
}

for(cyl in sort(unique(mtcars$cyl))) foo(cyl)
ls()
#> [1] "cyl"                    "foo"                   
#> [3] "gears_cars_cylinders_4" "gears_cars_cylinders_6"
#> [5] "gears_cars_cylinders_8"
gears_cars_cylinders_4
#> Source: local data frame [3 x 2]
#> 
#>    gear     n
#>   (dbl) (int)
#> 1     3     1
#> 2     4     8
#> 3     5     2
Run Code Online (Sandbox Code Playgroud)

  • 我忍不住觉得这与我在R中教过的一切都背道而驰,在将类似数据分组到诸如list之类的结构中方面。而且,如果`dplyr`的目的是简化事物,则将其与`assign`和环境操作混为一谈似乎是过大了。“齿轮&lt;-by(mtcars,mtcars $ cyl,FUN = function(x)data.frame(table(x $ gear)))”,然后像`gears [[“ 4”]]`一样访问似乎少了很多错误-易于。 (6认同)