r - 在 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
有任何想法吗?提前致谢。
解决方案
我认为这可以帮助你。但是,如果您可以共享一些示例数据以便我们检查结果会更好。
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)
}
推荐阅读
- javascript - 将对象数组从后端传递到前端
- dll - Mingw-w64 无法链接版本库
- javascript - 奇怪的“未找到模块:无法解决”错误
- javascript - 如何通过使用 HTML Canvas 连接位于等边三角形的三个边上的三个坐标来找到坐标
- wordpress - 将 WP Query 用于轮播滑块
- docker - Docker 错误 standard_init_linux.go:185: exec 用户进程导致“exec 格式错误与 Qnap TS131P
- java - 如何在 NetBeans 中安装 TestNG?
- python - DeleteView 标记不活动而不是删除?
- r - 在 R 中将多个 2d 图像显示为堆栈
- python - Matplotlib:点神秘地改变 alpha