返回在R中的函数内创建的data.frames列表

时间:2018-06-27 21:20:45

标签: r list function dataframe

我正在尝试减少脚本中的重复代码,为此,我创建了一些辅助函数。

我正在使用的一个函数不带任何参数,而是使用已经加载到全局环境中的数据集来创建一些子集,然后返回这些data.frames。

我在下面创建了一个简单的示例,该示例并不完全符合我的描述,但是会给出其结构的想法。

# Create function
my_func <- function(){
  a <- as.data.frame("ID" = c(1, 2, 3, 4, 5, 6), 
                     "TYPE" = c(1, 1, 2, 2, 3, 3), 
                     "CLASS" = c(1, 2, 3, 4, 5, 6))
  b <- as.data.frame("ID" = c(1, 2, 3, 4, 5, 6), 
                     "STATUS" = c(1, 1, 2, 2, 3, 3))
  return(list(a, b))
}

# Call to the function
list[a, b] <- my_func()

我遇到的问题不在函数内,而是在调用函数并尝试存储结果时。 如果我这样调用函数:

my_func()

它将两个data.frames打印为列表,但是,当尝试为其分配名称时,出现a does not exist错误。 我以为我只是错误地退还了它们,或试图错误地存储了它们。

谢谢!

更新

作为参考,我尝试使用此语法的原因是由于此帖子:How to assign from a function which returns more than one value?

此外,我希望在1行中捕获收益,而不必单独分配收益。

例如,在这种情况下,将其分配为:

test <- my_func()
a <- test[[1]]; b <- test[[2]]

但是,如果我的清单更长,这将变得非常乏味。

2 个答案:

答案 0 :(得分:1)

函数as.data.frame()将现有对象转换为数据框。函数data.frame()是创建数据框所需要的。您也不想将列名作为字符串传递。如果您删除引号并将功能更改为data.frame(),它将起作用!

# Create function
my_func <- function(){
  a <- data.frame(ID = c(1, 2, 3, 4, 5, 6), 
                  TYPE = c(1, 1, 2, 2, 3, 3), 
                  CLASS = c(1, 2, 3, 4, 5, 6))
  b <- data.frame(ID = c(1, 2, 3, 4, 5, 6), 
                  STATUS = c(1, 1, 2, 2, 3, 3))
  return(list(a, b))
}

# Call to the function
test <- my_func()

R函数只能返回一个值,因此我们将ab连接到一个列表中并返回该值。要访问数据框,可以按索引选择它们:

test[[1]]  # returns data.frame 'a' (yes, indices in R start with 1)
test[[2]]  # returns data.frame 'b'

答案 1 :(得分:0)

这是更长的数据帧列表的解决方案。

    my_func <- function(n){
    df_list<-list()
    for (i in 1:n){
    df_list[[i]]<-data.frame('ID'=rep(i,n), 'sqrt'=rep(sqrt(i),n),    'Class'=rep(sample.int(i,1), n))
    
    return(list(my_df=sapply(1:n, function(i)list(df_list[[i]]))))
    }
   output= my_func(10)$my_df[[1]]
   print(output)

如果要将数据帧“放回原处”,则可以使用rbind函数遍历列表以返回一帧。 希望这是您所需要的。让我知道。