Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r:将自定义函数中创建的列表中的n个数据帧子集分配给全局环境中的对象_R_List_Function_Dataframe_Subset - Fatal编程技术网

r:将自定义函数中创建的列表中的n个数据帧子集分配给全局环境中的对象

r:将自定义函数中创建的列表中的n个数据帧子集分配给全局环境中的对象,r,list,function,dataframe,subset,R,List,Function,Dataframe,Subset,这是我第一次尝试列表。我尝试清理我的代码,并在函数中放入一些代码。 一个想法是用一个函数将一个大数据帧子集成多个子集。因此,我可以在需要时使用函数调用子集 对于mtcars数据框,我想解释一下我正在尝试做什么: 将id添加到mtcars 创建一个带有一个参数(mtcars)的函数,该参数输出子集数据帧列表(mtcars1、mtcars2、mtcars3)->此处学习:由Federico Giorgi回答 我的目标是创建列表。但是,当看到全局环境中的3个子集数据帧对象(mtcars1、mtcars

这是我第一次尝试列表。我尝试清理我的代码,并在函数中放入一些代码。 一个想法是用一个函数将一个大数据帧子集成多个子集。因此,我可以在需要时使用函数调用子集

对于mtcars数据框,我想解释一下我正在尝试做什么:

  • 将id添加到mtcars
  • 创建一个带有一个参数(mtcars)的函数,该参数输出子集数据帧列表(mtcars1、mtcars2、mtcars3)->此处学习:由Federico Giorgi回答
  • 我的目标是创建列表。但是,当看到全局环境中的3个子集数据帧对象(mtcars1、mtcars2、mtcars3)时,我的知识就要结束了。那么,如何使用函数从列表中调用这3个数据帧对象呢。谢谢

    我的代码:

    library(dplyr)
    # add id to mtcars
    mtcars <- mtcars %>% 
        mutate(id = row_number())
    
    # create function to subset in 3 dataframes
    
    my_func_cars <- function(input){
        # first subset
        mtcars1 <- mtcars %>% 
            select(id, mpg, cyl, disp)
        
        # second subset
        mtcars2 <- mtcars  %>% 
            select(id, hp, drat, wt, qsec)
        
        # third subset
        mtcars3 <- mtcars %>% 
            select(id, vs, am, gear, carb)
        
        output <- list(mtcars1, mtcars2, mtcars3)
        return(output)
    }
    
    
    output<-my_func_cars(mtcars)
    
    for (i in output) {
        print(i)
    }
    
    库(dplyr)
    #将id添加到mtcars
    mtcars%
    变异(id=行号()
    #在3个数据帧中创建要子集的函数
    
    my_func_cars最好输出一个命名的
    列表

    library(dplyr)
    library(stringr)
    
    
    my_func_cars <- function(input){
    
        nm1 <- deparse(substitute(input))
        # first subset
        obj1 <- input %>% 
            select(id, mpg, cyl, disp)
        
        # second subset
        obj2 <- input  %>% 
            select(id, hp, drat, wt, qsec)
        
        # third subset
        obj3 <- input %>% 
            select(id, vs, am, gear, carb)
        
       dplyr::lst(!! str_c(nm1, 1) := obj1, 
                  !! str_c(nm1, 2) := obj2, 
                  !! str_c(nm1, 3) := obj3)
        
    }
    
    -检查对象

    head(mtcars1, 2)
    #  id mpg cyl disp
    #1  1  21   6  160
    #2  2  21   6  160
    
    head(mtcars2, 2)
    #  id  hp drat    wt  qsec
    #1  1 110  3.9 2.620 16.46
    #2  2 110  3.9 2.875 17.02
    
    
    head(mtcars3,  2)
    #  id vs am gear carb
    #1  1  0  1    4    4
    #2  2  0  1    4    4
    

    无需运行
    for()
    循环即可查看数据帧。您只需运行:
    output
    ,它们都会显示在控制台中。如果您想查看特定的数据帧,可以使用
    [[
    输出[[1]]
    输出[[2]]
    输出[[3]]
    对列表进行子集。非常有用的建议。谢谢。感谢阿克伦。您的第一个解决方案对我来说是最清晰的。您能再次发布此信息吗。我认为在您的最新编辑中:mtcars%mutate(id=row_number())缺少。请解释一下nm1@TarJae Thanks,我用添加的
    id
    更新了传递到函数中的输入数据。关于
    deparse
    ,substitute。传递的对象是data.frame
    mtcars
    ,因此,通过执行
    deparse(substitute
    ,我们将对象名称作为字符串
    “mtcars”
    ,我们将使用它来创建列表元素的名称。
    dplyr/purrr
    lst
    具有分配选项(
    :=
    )lhs上的名称基于object的值。我将硬编码的
    mtcars1
    mtcars2
    更改为函数中更自动的方式。也可以使用更多具有列名的参数
    head(mtcars1, 2)
    #  id mpg cyl disp
    #1  1  21   6  160
    #2  2  21   6  160
    
    head(mtcars2, 2)
    #  id  hp drat    wt  qsec
    #1  1 110  3.9 2.620 16.46
    #2  2 110  3.9 2.875 17.02
    
    
    head(mtcars3,  2)
    #  id vs am gear carb
    #1  1  0  1    4    4
    #2  2  0  1    4    4