首页 > 解决方案 > 在 R 中编写函数来修改数据框列表时遇到问题

问题描述

我有一个数据框列表(“年”),其中每个数据框都按年份命名:

type_of(years)
[1] "list"
names(years)
[1] "2008"  "2009"  "2010"  "2011"  "2012"  "2013"  "2013a"  "2014"  "2015"  "2015a"  "2016" 

我一直在尝试编写一个函数,它将列表作为参数,获取名称以“a”结尾的所有数据帧(对于“附录”),然后找到数据帧的匹配年份(所以“2013a”匹配“2013”​​)。然后,该函数将对匹配的年份数据框执行附录的 semi_join,并返回一个仅包含未更改和组合数据框的列表。

#desired result
names(years)
[1] "2008"  "2009"  "2010"  "2011"  "2012"  "2013"  "2014"  "2015"  "2016"

我已经尝试了几次迭代,但无济于事。以下是我尝试过的最新功能及其生成的错误消息。

MergeAddA <- function(lst) {

#finds data frames with addendum  
adds <-grep("\\d{4}a+", objects(lst), value = FALSE)   

  #finds match for addendum and joins data frames
  for (add in adds) {
  
    add <- lst[[add]]
    
    add_to <- grep(gsub("a", "", add), objects(lst), value = FALSE, fixed = TRUE)
    
    add_to <- lst[[add_to]]
    
    semi_join(add_to, add, by = c("case_number", "job_order_number"))
  }
return(lst)
}

years  %>% MergeAddA()
Error during wrapup: attempt to select less than one element in get1index
Error: no more error handlers available (recursive errors?); invoking 'abort' restart

有任何想法吗?提前致谢。

标签: r

解决方案


我认为这可以帮助你。但是,如果您可以共享一些示例数据以便我们检查结果会更好。

MergeAddA <- function(lst) {
  new_list <- list()
  
  for (name_loop in names(lst)) {
    
    # Names like "2012a"
    if (stringr::str_ends(name_loop, "a")) {
      name_clean <- substr(name_loop, 1, nchar(name_loop) - 1)
      new_list[[name_clean]] <- semi_join(
        lst[[name_clean]], 
        lst[[name_loop]],
        by = c("case_number", "job_order_number")
      )
    # Names like "2012" that aren't already in the new list.
    } else if (!name_loop %in% names(new_list)) {
      new_list[[name_loop]] <- lst[[name_loop]]
    }
  }
  return(new_list)
}


推荐阅读