在函数中使用Dplyr创建新的数据帧

时间:2015-11-20 06:01:28

标签: r dplyr

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

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

对于我可重复的基础案例bog简单示例,我使用了这个:

filter(mtcars, cyl == 4)

我知道我需要将它分配给自己的数据帧,所以我开始使用:

paste("Cylinders:", x, sep = "") <- filter(mtcars, cyl == 4))

这没用 - 它给了我在这里找到的错误:Assignment Expands to Non-Language Object

从那里,我发现了这个:Create A Variable Name with Paste in R

(同样,对上述作者的重大提升)

这导致我这样做,这有效:

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

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

的所有好东西
filter(mtcars, cyl == 4) %>% 
        group_by(gear) %>% 
        summarise(number_of_cars = n())

但最终,我认为我需要将整个事物包装在一个函数中,并能够从mtcars$cyl中提取圆柱数。我在想plyr::ldply(mtcars$cyl, function_name)之类的东西?

在我的实际数据中,我有大约70个不同的类,我需要拆分成单独的数据帧,以便放入Shiny的DT::datatable标签中,这是一个完整的混乱。反正。

当我尝试这个时:

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

然后function_name(6)

我将数据框的输出输出到屏幕,但不是带有名称的数据框。

我在这里找对答案了吗?

1 个答案:

答案 0 :(得分: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