Обработка вопроса об атрибутах - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь написать функцию, которая принимает атрибуты столбцов и преобразует их в соответствующие строки.

Мои данные имеют метки переменных (описание столбца), имена переменных, тип (коэффициент, цифра, символ) и определенные уровни фактора (например, 1 = да, 2 = нет).Я хотел бы использовать функцию, которая генерирует строку, которая содержит всю информацию в соответствующем порядке:

Q B
Q [varname] vallab
T S #type
R yes
R no
Q E

Я написал функцию так:

WriteQ<-function(VarLab,VarName,Responses,VarType) {
  cond<-sapply(VarType, switch,
               factor="T S\n",
               numeric="T I\n",
               character="T C\n")
  mystr<-paste0("Q B\nQ [",VarName,"] ", VarLab, "\n",cond,"L0L2\n",paste("R",Responses, collapse =  "\n"),"\nQ E")
  return(mystr)
}

И пытаюсь вызвать это как:

attributes(data)$qps<-WriteQ(attributes(data)$variable.labels,
                               attributes(data)$names,
                               unlist(lapply(data, attr, "levels")),
                               unlist(lapply(data, class)))

Хотя VarLab, VarName и VarType работают нормально, у меня проблема с ответами.Он печатает все уровни формы всего кадра данных в каждом разделе.Как мне передать список уровней отдельно для каждого столбца?

Структура файла:


structure(list(id = c(1, 2), q23 = structure(1:2, .Label = c("yes", 
"no", "don't know"), class = "factor"), gender = structure(c(1L, 
1L), .Label = c("male", "female"), class = "factor"), age = c(33, 
44)), row.names = 1:2, variable.labels = c("id", "Do you like flowers?", 
"Select gender...", "How old are you?"), class = "data.frame")

1 Ответ

0 голосов
/ 26 мая 2019

Вот снимок:

WriteQ <- function(VarLab, VarName, Responses, VarType) {
  Qs <- sprintf("Q [%s] %s", VarName, VarLab)
  Ts <- sapply(VarType, switch,
               factor="T S",
               numeric="T I",
               character="T C")
  Rs <- lapply(Responses, function(r) sprintf("R %s L0L2", r))
  QEs <- rep("Q E", length(VarLab))
  out <- Map(c, Qs, Ts, Rs, QEs)
  out
  # setNames(out, VarName)
  # setNames(lapply(out, paste, collapse = "\n"), VarName)
  # unlist(out, use.names = FALSE)
  # paste(unlist(out), collapse = "\n")
}

Выход по умолчанию:

out
# $`Q [id] id`
# [1] "Q [id] id" "T I"       "Q E"      
# $`Q [q23] Do you like flowers?`
# [1] "Q [q23] Do you like flowers?" "T S"                         
# [3] "R yes L0L2"                   "R no L0L2"                   
# [5] "R don't know L0L2"            "Q E"                         
# $`Q [gender] Select gender...`
# [1] "Q [gender] Select gender..." "T S"                        
# [3] "R male L0L2"                 "R female L0L2"              
# [5] "Q E"                        
# $`Q [age] How old are you?`
# [1] "Q [age] How old are you?" "T I"                     
# [3] "Q E"                     

Альтернативные форматы вывода, в зависимости от ваших потребностей:

setNames(out, VarName)
# $id
# [1] "Q [id] id" "T I"       "Q E"      
# $q23
# [1] "Q [q23] Do you like flowers?" "T S"                         
# [3] "R yes L0L2"                   "R no L0L2"                   
# [5] "R don't know L0L2"            "Q E"                         
# $gender
# [1] "Q [gender] Select gender..." "T S"                        
# [3] "R male L0L2"                 "R female L0L2"              
# [5] "Q E"                        
# $age
# [1] "Q [age] How old are you?" "T I"                     
# [3] "Q E"                     

setNames(lapply(out, paste, collapse = "\n"), VarName)
# $id
# [1] "Q [id] id\nT I\nQ E"
# $q23
# [1] "Q [q23] Do you like flowers?\nT S\nR yes L0L2\nR no L0L2\nR don't know L0L2\nQ E"
# $gender
# [1] "Q [gender] Select gender...\nT S\nR male L0L2\nR female L0L2\nQ E"
# $age
# [1] "Q [age] How old are you?\nT I\nQ E"

unlist(out, use.names = FALSE)
#  [1] "Q [id] id"                    "T I"                         
#  [3] "Q E"                          "Q [q23] Do you like flowers?"
#  [5] "T S"                          "R yes L0L2"                  
#  [7] "R no L0L2"                    "R don't know L0L2"           
#  [9] "Q E"                          "Q [gender] Select gender..." 
# [11] "T S"                          "R male L0L2"                 
# [13] "R female L0L2"                "Q E"                         
# [15] "Q [age] How old are you?"     "T I"                         
# [17] "Q E"                         

paste(unlist(out), collapse = "\n")
# [1] "Q [id] id\nT I\nQ E\nQ [q23] Do you like flowers?\nT S\nR yes L0L2\nR no L0L2\nR don't know L0L2\nQ E\nQ [gender] Select gender...\nT S\nR male L0L2\nR female L0L2\nQ E\nQ [age] How old are you?\nT I\nQ E"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...