如何在列表列表中更改嵌套数据框的别名

时间:2019-07-29 13:23:19

标签: r list names

我有一个数据帧列表,其名称如下所示:

lapply(L2, function(x) {print(names(x))}):

$D1
[1] "TP1.adjPVal" "TP1.Log2FC" 

$D2
[1] "TP2.adjPVal" "TP2.Log2FC" 

$D3
[1] "TP3.adjPVal" "TP3.Log2FC" 

$D7
[1] "TP7.adjPVal" "TP7.Log2FC" 

$D14
[1] "TP14.adjPVal" "TP14.Log2FC" 

我想将所有TP更改为D

我已经尝试从搜索stackoverflow中获取以下代码,但仍在努力实现自己的目标。

lapply(L2, function(x) {gsub(x = names(x), pattern = 'TP', replacement = 'D')})

setNames(L2$D1, tp$D1)

lapply(L2, function(x) { colnames(x) <- gsub(x = colnames(x), pattern = 'TP', replacement = 'D')})

在此问题上的任何帮助都将受到欢迎。

1 个答案:

答案 0 :(得分:1)

我们需要返回x,即data.frame。在OP的代码中,它仅执行分配。另外,由于“ TP”位于字符串的开头,因此可以使用^来指定开始,我们不需要gsub而是使用sub(用于单替换)< / p>

lapply(L2, function(x) {
       colnames(x) <- sub(x = colnames(x), pattern = '^TP', replacement = 'D')
      x}
       )

或者另一个选择是setNames。在这种情况下,我们可以像setNames内部进行分配一样即时进行分配

lapply(L2, function(x) setNames(x, 
        sub(x = colnames(x), pattern = '^TP', replacement = 'D')))

此外,如果我们使用tidyverse

library(tidyverse)
map(L2, ~ .x %>%
            rename_at(vars(starts_with("TP")), ~ str_replace(., "^TP", "D")))