使用 lapply 返回环境中的数据帧

Posted

技术标签:

【中文标题】使用 lapply 返回环境中的数据帧【英文标题】:Returning data frames in the environment using lapply 【发布时间】:2019-08-23 21:59:05 【问题描述】:

这可能是一个基本问题,但我试图构建一个在环境中创建单独数据框的函数。有一个类似的问题,所以我查看here 认为这是答案,但我做错了其他事情。

我希望这段代码在环境中创建 3 个不同的数据帧,分别称为“df_result1”、“df_result2”、“df_result3”。我认为“df_result1”将是一个以“name1”和 2 作为值的数据框。 “df_result2”将是一个以“name2”和 4 作为值的数据框。相反,我只在值窗口中显示项目。

我的问题是我做错了什么——为什么我没有在环境中获得 3 个数据帧,我需要做什么才能获得预期的结果。谢谢你。

这是我的可重现示例

library(tidyverse)

my_numbers <- c(2, 4, 6)
my_names <- c("name1", "name2", "name3")

 # make data frame
my_function <- function(name, factor) 
  df = data.frame(student = name, number = my_numbers)
 

 # lapply function
simple_fx <- function(my_numbers, my_function, my_names) 
  i = 1 
  for(my_name in my_names) 
    df        <- lapply(my_names, my_function, my_numbers[[i]])
    df_merged <- Reduce(function(...) merge(..., all = TRUE), df)
    names(df_merged) <- paste0("df_result", i)
    list2env(df_merged, envir = .GlobalEnv)
    i = i + 1

  



simple_fx(my_numbers, my_function, my_names)

【问题讨论】:

就这么做:list2env(split(data.frame(numbers = my_numbers,names = my_names),paste0("df_results",1:3)),.GlobalEnv) 【参考方案1】:

我不建议从函数内部在全局环境中编写对象。您始终可以从函数返回数据帧列表,但这是执行 OP 尝试的一种方法。

my_function <- function(name, factor) 
  df = data.frame(student = name, number = factor)
  return(df)
 

simple_fx <- function(my_numbers, my_names) 
    df  <- Map(my_function, my_numbers, my_names)
    names(df) <- paste0("df_result", seq_along(df))
    list2env(df, envir = .GlobalEnv)


simple_fx(my_numbers, my_names)

我们现在在全球环境中有 3 个数据框 df_result1df_result2df_result3

【讨论】:

以上是关于使用 lapply 返回环境中的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

在列表中的多个数据帧上应用 lapply,R

从 lapply 返回匿名函数 - 出了啥问题?

如何从power bi中的python函数返回单个数据帧

将 lapply 与 for 和 if..else 语句结合使用,将条件列添加到多个数据帧

使用lapply或for循环将多个csv文件拉入自己的R数据帧

对具有相同结构的几个数据集使用lapply并可能进行for循环以提取和计算每个数据帧的值