Наклеивание ярлыков - важная часть обеспечения понятности данных опроса при представлении.
Итак, лучший пример, который я могу найти, использует expss :: apply_labels (), например, знаменитый пример mtcars https://cran.r-project.org/web/packages/expss/vignettes/tables-with-labels.html
в качестве ввода для этого требуется таблица данных и список пар присваиваний, разделенных запятыми, например
apply_labels(dt, col1 = "label1", col2 = "label2", col3 = "label3")
Это нормально, если у вас есть один файл данных и несколько столбцов, и вы можете беспокоиться, вводя их каждый раз, но это не очень полезно, если у вас много файлов данных. Итак, как можно загрузить файл метаданных csv в формате:
Col1 Col2 Col3
Этикетка1 Этикетка2 Этикетка3
где имена Col соответствуют тем же именам в таблице данных
это означает эффективный перевод CSV-файла метаданных так, чтобы он генерировал
col n = "label n"
для каждого столбца.
До сих пор я обнаружил, что самая большая проблема заключается в том, что имена столбцов с метками применения являются объектами, а не строками, и очень сложно преобразовать строку в объект в правильной области.
Вот где я должен
library(expss)
library(data.table)
library(glue)
readcsvdata <- function(dfile)
{
rdata <- fread(file = dfile, sep = "," , quote = "\"" , header = TRUE,
stringsAsFactors = FALSE, na.strings = getOption("datatable.na.strings","NA"))
return(rdata)
}
rawdatafilename <- "testdata.csv"
rawmetadata <- "metadata.csv"
mdt <- readcsvdata(rawmetadata)
rdt <-readcsvdata(rawdatafilename)
commonnames <- intersect(names(mdt),names(rdt)) # find common
qlabels <- as.character(mdt[1, commonnames, with = FALSE])
comslist <- list()
for (i in 1:length(commonnames)) # loop through commonnames and qlabels
{
if (i == length(commonnames))
{x <- glue('{commonnames[i]} = "{qlabels[i]}"')} # no comma for final item
else
{x <- glue('{commonnames[i]} = "{qlabels[i]}",')} # comma for next item
comslist[[i]] <- x
}
comstring <- paste(unlist(comslist), collapse = '')
tdt = apply_labels(tdt, eval(parse(text = comstring)))
который дает
Ошибка синтаксического анализа (text = comstring):: 1: 24: неожиданно ',' 1: varone = "Label1", ^
ой и print (comstring) производит:
[1] "varone = \" Вопрос один \ ", vartwo = \" Вопрос два \ ", varthree = \" Вопрос три \ ", varfour = \" Вопрос четыре \ ", varfive = \" Вопрос пять \ ", varsix = \ "Вопрос шесть \", varseven = \ "Вопрос семь \", vareight = \ "Вопрос восемь \", varnine = \ "Вопрос девять \", varten = \ "Вопрос десять \" »
read.csv
(илиfread
или как-то еще), тогдаdo.call(apply_labels, c(list(dt), csvdat))
должен работать. - person r2evans   schedule 27.05.2020var_lab
в цикле:for(each in colnames(metadata)) var_lab(dt[[each]]) = metadata[[each]]
- person Gregory Demin   schedule 27.05.2020