【问题标题】:Return a list of data.frames created within a function in R返回在 R 中的函数中创建的 data.frames 列表
【发布时间】:2018-06-27 21:20:45
【问题描述】:

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

我正在处理的一个函数没有接受任何参数,而是使用已加载到全局环境中的数据集来创建一些子集,然后返回这些 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()

它将 2 个 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]]

但是,如果我有一个更长的列表,这将变得非常乏味。

【问题讨论】:

  • 我不太清楚你在问什么,但似乎你只是想将 return 更改为 return(list(a = a, b = b))
  • 如果你不想在函数中硬编码,setNames(my_func(),c("a","b"))
  • @Ryan 我已经这样尝试过了,但它仍然给了我同样的错误。
  • 哪一行给你这个错误?
  • 从他写这个答案的方式可能有点难以分辨,但该语法取决于他编写的自定义函数(他链接到定义)并且他随后添加到他的一个包。但它不是 R 本身的一部分。

标签: r list function dataframe


【解决方案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'

【讨论】:

    【解决方案2】:

    这是针对较长数据框列表的解决方案。

        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 函数循环遍历列表以返回一帧。 希望这是您所需要的。告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2015-07-17
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多