我想要做的是使用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)
,
我将数据框的输出输出到屏幕,但不是带有名称的数据框。
我在这里找对答案了吗?
答案 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