我有一个包含不同分类群的几个数据框的列表。不同分类群的df具有不同的长度,并且具有“相同信息”的列具有不同的名称,例如“abundance”,“abund”,“individuals”。我给你看一个例子:
spiders <- data.frame(plot = c(1,2,3),
abundance = c(1,4,8),
habitat = c(rep("forest", 3)))
bugs <- data.frame(plot = c(1,2,3),
abund = c(1,4,8))
birds<- data.frame(plot = c(1,2,3),
individuals= C(1,4,8),
habitat = c(rep("forest", 3)),
method = c(rep("visual", 3)))
lst <- list("spiders" = spiders, "bugs" = bugs, "birds" = birds)
show(lst)
$spiders
plot abundance habitat
1 1 1 forest
2 2 4 forest
3 3 8 forest
$bugs
plot abund
1 1 1
2 2 4
3 3 8
$birds
plot individuals habitat method
1 1 1 forest visual
2 2 4 forest visual
3 3 8 forest visual
在我的原始列表中,我有更多的dfs..我想做的是迭代dfs,并将所有包含“abund”或“individuals”的Colname更改为“abundance”,如果还没有的话。
如果我有一个列表,只有一个df lst %>% map(rename, abundance = abund)
可以正常工作,但是有更多的dfs和不同的colname,它说:
错误:无法重命名不存在的列。x列abund
不存在。
我试了几个代码:
lst %>% set_names(~sub("abund", "abundance", names(.x)))
lst %>% set_names(~sub("abund", "abundance", .x))
和许多其他与map_if
,map_at
,rename_if
,rename_at
等,但没有任何工作。
1条答案
按热度按时间qni6mghb1#
dplyr::rename_with()
对每个列名应用一个函数。在该函数中,我们可以使用grepl()
检查名称是否包含“abund”或“individuals”,然后这些列被重命名。不包含我们正在寻找的字符串的列也被重命名,但它们会重新使用旧名称,因此没有任何更改。为了使代码更容易理解,我们可以使用新的基R匿名函数风格来代替tidyverse风格的匿名函数。