R语言 按条件更改存储在列表中的数据框的列名

os8fio9y  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一个包含不同分类群的几个数据框的列表。不同分类群的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_ifmap_atrename_ifrename_at等,但没有任何工作。

qni6mghb

qni6mghb1#

dplyr::rename_with()对每个列名应用一个函数。在该函数中,我们可以使用grepl()检查名称是否包含“abund”或“individuals”,然后这些列被重命名。不包含我们正在寻找的字符串的列也被重命名,但它们会重新使用旧名称,因此没有任何更改。

library(dplyr)
library(purrr)

map(lst, ~ rename_with(., ~ ifelse(
  grepl("abund|individuals", .), "abundance", .
)))
#> $spiders
#>   plot abundance habitat
#> 1    1         1  forest
#> 2    2         4  forest
#> 3    3         8  forest
#> 
#> $bugs
#>   plot abundance
#> 1    1         1
#> 2    2         4
#> 3    3         8
#> 
#> $birds
#>   plot abundance habitat
#> 1    1         1  forest
#> 2    2         4  forest
#> 3    3         8  forest
#> 4    1         1  visual
#> 5    2         4  visual
#> 6    3         8  visual

为了使代码更容易理解,我们可以使用新的基R匿名函数风格来代替tidyverse风格的匿名函数。

map(lst, \(df) rename_with(df, \(name) ifelse(
  grepl("abund|individuals", name), "abundance", name
)))
#> $spiders
#>   plot abundance habitat
#> 1    1         1  forest
#> 2    2         4  forest
#> 3    3         8  forest
#> 
#> $bugs
#>   plot abundance
#> 1    1         1
#> 2    2         4
#> 3    3         8
#> 
#> $birds
#>   plot abundance habitat
#> 1    1         1  forest
#> 2    2         4  forest
#> 3    3         8  forest
#> 4    1         1  visual
#> 5    2         4  visual
#> 6    3         8  visual

相关问题