У меня есть список из 140 слов, которые я хотел бы отобразить в таблице в алфавитном порядке. Я не хочу, чтобы они отображались как один супер длинный список, а скорее разбивались на столбцы, где это уместно (например, может быть, четыре столбца?). Я использую flextable, но я не совсем уверен, как это сделать…
Воспроизведите тип данных, которые у меня есть, и формат:
install.packages("stopwords")
library(stopwords)
word<-as_tibble(head(data_stopwords_smart$en, n=140))
затем я помещаю его в таблицу, но он дает один очень длинный столбец
wordtable<-flextable(word) %>%
set_header_labels(rows = "") %>%
autofit()
Один из способов сделать это — разделить вектор слов на N секций и установить каждую в виде столбца во фрейме данных. Затем просто установите имена столбцов пустыми, кроме первого. В приведенном ниже примере я сделал это вручную, но процесс должен быть относительно простым для автоматизации, если вы заранее не знаете, какой длины будет вектор.
word <- head(data_stopwords_smart$en, n=140)
word <- data.frame(value1=word[1:35],
value2=word[36:70],
value3=word[71:105],
value4=word[106:140])
wordtable <- flextable(word) %>%
set_header_labels(value1="Value",
value2=NA,
value3=NA,
value4=NA) %>%
autofit()
Вот функция, которую я придумал, которая автоматизирует процесс. Вам просто нужно указать вектор и количество столбцов, на которые вы хотите его разбить.
flextable_ncol <- function(words, ncol){
# Split into N chunks
word.ls <- split(words, rep(seq_along(words), each=ceiling(length(words)/ncol))[1:length(words)])
# put NAs into chuncks to make all chuncks equal length
if (length(word.ls[[length(word.ls)]]) < length(word.ls[[1]])){
word.ls[[length(word.ls)]] <- c(word.ls[[length(word.ls)]],
rep(NA, length(word.ls[[1]]) - length(word.ls[[length(word.ls)]])))
}
# make into a data frame
word.df <- as.data.frame(do.call(cbind, word.ls))
# Get column names
col.names <- c('Value', rep(NA, ncol-1))
names(col.names) <- names(word.df)
# make table
wordtable <- flextable(word.df)
wordtable <- set_header_labels(wordtable, values=col.names)
return(wordtable)
}
Вы можете использовать это так
word <- head(data_stopwords_smart$en, n=140)
flextable_ncol(word, 8)