【问题标题】:Using Dplyr In A Function To Create New Dataframes在函数中使用 Dplyr 创建新的数据框
【发布时间】:2015-11-20 06:01:28
【问题描述】:

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

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

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

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)

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

我在这里寻找答案吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您需要将新数据框分配到您从中调用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
    

    【讨论】:

    • 我不禁觉得这与我在 R 中所学的一切背道而驰,将类似的数据分组到 lists 这样的结构中。如果dplyr 的目的是为了简化事情,那么将它与assign 混合在一起并进行环境操作似乎有点矫枉过正。 gears &lt;- by(mtcars, mtcars$cyl, FUN=function(x) data.frame(table(x$gear)) ) 然后像 gears[["4"]] 这样访问似乎更不容易出错。
    • 是的,这通常也是我的想法。但也许在某些情况下,您实际上需要将这些数据帧作为单独的对象?
    • 老实说,我想不出有必要这样做的场合。如果你有 cyl4 cyl6 cyl18 的 data.frames 在 GlobalEnv 中浮动,那么你需要在 pasted 上循环 "cyl"i in c(4,6,18) 的向量并使用 get() 来检索他们,当你可以做gears[[i]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多