我想做的是使用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),
我将数据框的输出输出到屏幕上,但没有将名称输出到数据框。
我在寻找答案吗?
您需要将新的数据帧分配到要从其调用的环境中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)