Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically set colnames from character string in flextable

The flextable help details describes adding new headers as manually typing each existing header name against each new header name, like this:

library(flextable)
ft_1 <- regulartable(head(iris))
ft_1 <- set_header_labels(ft_1, Sepal.Length = "SL",
                          Sepal.Width = "SW", Petal.Length = "PL",
                          Petal.Width = "PW"
)
ft_1

How can I just add all new header names from a character string such as

(names2<-c('SL','SW','PL','PW','SPECIES'))
[1] "SL"      "SW"      "PL"      "PW"      "SPECIES"

?

So far I have managed a very hacky solution:

names(names2)<-names(ft_1$header$dataset[1,])

ft_1$header$dataset[1,]<-names2
like image 382
J.Con Avatar asked Nov 20 '18 03:11

J.Con


2 Answers

set_header_labels is made for minor modifications of header values. You can use set_header_df if you want to map df column names with a set of one or more new header rows: https://davidgohel.github.io/flextable/articles/layout.html#define-headers-with-a-reference-table

library(flextable)

names1 <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
names2 <- c('SL','SW','PL','PW','SPECIES')

ft <- flextable( head( iris ) )
ft <- set_header_df(x = ft, mapping = data.frame(keys = names1, values = names2, stringsAsFactors = FALSE),
              key = "keys" )

# the following call is needed as header formats have been 
# replaced by vanilla formats when set_header_df() has been called
ft <- theme_booktabs(ft) 
ft

enter image description here

like image 186
David Gohel Avatar answered Oct 01 '22 01:10

David Gohel


OK, after a couple edits I hope this works for you.

Your method seems plenty fine as well.

names1 <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
names2 <- c('SL','SW','PL','PW','SPECIES')

ft <- flextable( head( iris ),
                   col_keys = names1 )

oldHeaders <- names1
newHeaders <- names2

headerlist <- setNames(as.list(newHeaders), 
                       oldHeaders)

ft <- do.call(set_header_labels, c(list(x = ft, top = F), headerlist))
ft
like image 29
hmhensen Avatar answered Oct 01 '22 01:10

hmhensen