使用 for 循环遍历列名向 gt 表添加标签

问题描述 投票:0回答:2

我有以下数据表。

library(dplyr)
library(gt)

df <- tibble(
      `model 2000` = c("a", "b"), 
      `car 2022` = c("f", "d")
) 

我想循环列名向量并执行字符串替换,然后将其附加到 gt 表

my_cols <- colnames(df)  


for(i in my_cols){
      
            
   df <- df %>%
                    gt() %>%
                    cols_label(
                          
                              i = str_trim(str_remove(i, "2020|2021|2022"))
                
          ) 
 df

}

我希望能够在使用此 for 循环创建 GT 表后更改名称,但是当循环传递 my_cols 中的值时,它们无法识别......有什么帮助吗?

这是错误:

Error: All column names provided must exist in the input `.data` table. 
r dplyr gt
2个回答
4
投票

实现此目的的一种方法是避免循环并传递命名向量并将其拼接在内部

cols_labels()

my_cols <- setNames(str_trim(str_remove(names(df), "2020|2021|2022")), names(df))   

df %>%
    gt() %>%
    cols_label(!!!my_cols)

如果由于某种原因必须使用循环,则需要在循环外部创建

gt()
对象,否则在第一次迭代之后,您将一个已经是
gt_tbl
类的对象传递给
gt()
函数,该函数导致错误。 您还需要使用海象运算符
:=
而不是
=
,并且 LHS 需要是符号或粘合字符串。

my_cols <- names(df) 

df <- df %>%
  gt()

for(i in my_cols) {
  df <-  df %>%
    cols_label("{i}" := str_trim(str_remove(i, "2020|2021|2022"))) # or !!sym(i) := ...
}   

df

enter image description here


1
投票

您可以使用

.list
中的
cols_label()
选项。


my_cols <- colnames(df)  

df %>%
  gt() %>%
  cols_label(
    .list = setNames(as.list(str_trim(str_remove(my_cols, "2020|2021|2022"))), my_cols)    
  )

但是,这样做似乎更容易:

my_cols <- colnames(df)  

df %>% 
  rename_with(~str_trim(str_remove(.x, "2020|2021|2022")), .cols =my_cols) %>% 
  gt()

输入:

df <- tibble(
  `model 2021` = c("a", "b"), 
  `car 2022` = c("f", "d")
) 
© www.soinside.com 2019 - 2024. All rights reserved.