【问题标题】:Dataframes within list within list - how to access each dataframe in R列表中列表中的数据框 - 如何访问 R 中的每个数据框
【发布时间】:2021-07-16 21:10:44
【问题描述】:

我对 R 很陌生,所以请多多包涵。

我使用以下代码阅读了一个 Excel 电子表格,其中包含 31 年 MLB 潜在客户数据的单独表格:

path = "../Documents/BA Prospects 1990-2021.xlsx"
prospect_data <- excel_sheets(path = path) %>% 
  map(~ data.frame(read_excel(path, sheet = .)))

然后我编写了一个函数来稍微清理一下数据,并将其应用于所有 31 个元素:

pull_df <- function(data, n = 1, year = 1990) {
    prospect_data[[n]] %>%
        data.frame() %>%
        filter_all(any_vars(!is.na(.))) %>% 
        mutate(year = year) %>% 
        select(year, everything())
}

prospect_data <- lapply(prospect_data[1:31], pull_df)

我想要的是获取 31 个数据帧并全局保存每个数据帧。但是,这些数据框都嵌套在单独的列表中。这 31 个列表嵌套在列表前景数据中。无论我尝试什么,使用 for 循环和所有方法,我都无法从前景数据列表中提取这些数据帧以便能够进一步操作它们。老实说,此时我会选择一个 3100 行和 17 列的大数据框。我只想将我的数据放入数据框中。

我知道我解释得不好,但请帮忙!

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    在全局环境中创建单独的数据框不是一个好习惯。使用列表是一个更好的主意,或者如果您更喜欢将它们组合在一个大数据框中。 length(1990:2021) 也给出了 32 个值,所以我调整了下面的答案以使用 1990:2020,而不是如果你在 prospect_data 中总共有 31 个数据帧。

    library(dplyr)
    library(purrr)
    
    pull_df <- function(data, year) {
      data %>%
        filter_all(any_vars(!is.na(.))) %>% 
        mutate(year = year) %>% 
        select(year, everything())
    }
    
    combine_df <- map2_df(prospect_data, 1900:2020, pull_df)
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,prospect_data 是单元素列表的列表,其中每个组件列表中的单个元素是一个数据框。

      如果是这种情况,您可以使用以下方法“展平”前景数据:

      flattened_prospect_data <- unlist(prospect_data, recursive = FALSE)
      

      但是,如果前景数据是任意长度列表的列表,其中感兴趣的数据帧位于索引 j,您可以执行以下操作。

      flattened_prospect_data <- lapply(prospect_data, function(x) x[[j]])
      

      如果每个数据帧嵌套得更深,假设每个数据帧都是前景数据的元素的第 k 个元素,第 j 个元素,第 i 个元素。然后您可以使用

      执行递归提取
      flattened_prospect_data <- lapply(prospect_data, function(x) x[[c(i, j, k)]])
      

      在列表中包含所有数据框后,您可以使用它们按年份为它们分配一个名称

      get_year <- function(df) unique(df$year)
      create_name <- function(x) paste(x, "Prospects") # create_name(1990) returns "1990 Prospects"
      
      df_names <- sapply(flattened_prospect_data, function(x) create_name(get_year(x)))
      Map(function(x, y) assign(x,value = y, envir = .GlobalEnv), df_names, flattened_prospect_data)
      

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 2021-07-28
        • 2012-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 2021-07-23
        相关资源
        最近更新 更多