Преобразование символьного столбца в сохраняющий фактор метку столбца - PullRequest
0 голосов
/ 18 июня 2019

У меня есть фрейм данных, который я читаю из файла XLSX.Каждое имя столбца выглядит так: CODE___DESCRIPTION, например, A1 ___ Какой-то прикольный столбец здесь .Коды проще использовать в качестве имен столбцов, но я хочу использовать описание, когда это необходимо, поэтому оно должно храниться в кадре данных.Вот почему я использую пакет sjlabelled позже.

Создайте себе случайные данные и сохраните их как some_data.xlsx .

library(dplyr) #to play with tibbles
library(stringi) #to play with strings
library(writexl) #name speaks for itself

tibble(col1 = sample(c("a", "b", "c", NA, "N/A"), 50, replace = T),
       col2 = sample(c("d", "e", "f", NA, "N/A"), 50, replace = T),
       col3 = sample(c("g", "h", "i", NA, "N/A"), 50, replace = T),
       col4 = sample(c("j", "k", "l", NA, "N/A"), 50, replace = T)) %>%
  setNames(stri_c("A", 1:4, "___", stri_rand_strings(4, 10))) %>%
  write_xlsx(path = "some_data.xlsx", col_names = T, format_headers = F)

Я создал простую функцию для подготовки моих данных так, как я хочу.

library(sjlabelled) #to play with labelled data

label_it <- function(data = NULL, split = "___"){

#This basically makes an array of two columns (of codes and descriptions respectively)

  k.n <- data %>%
    names() %>%
    stri_split_fixed(pattern = split, simplify = T)

  data%>%
    set_label(k.n[,2]) %>% #set description as each column's label
    setNames(k.n[,1]) #set code as each column's name

}

Сначала я читаю данные из файла XLSX.Затем я его помечаю.

library(readxl) #name speaks for itself again

data <- read_xlsx("some_data.xlsx", na = c("", "N/A")) %>% 
   label_it()

Теперь каждый столбец моего информационного кадра - это символьный вектор (фактически это структура) с двумя атрибутами:

  • label являющаяся частью описания
  • names являющаяся исходным именем столбца кадра данных (стиль CODE___DESCRIPTION) и не должна быть ошибочно принята за вывод имен (данных), которые будут частью кода

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

Чтобы сделать это, я попробовал две вещи:

data[,1] <- factor(data[,1], levels = c("c", "a", "b"))
data[,3] <- factor(data[,3], levels = c("h", "g", "i"))

это меняет все значения этих двух столбцов на NA_integer _.

data <- data %>%
  mutate(A1 = factor(A1, levels = c("c", "a", "b")),
         A3 = factor(A3, levels = c("h", "g", "i")))

это меняет векторы символов на факторыкак предполагалось, но он отбрасывает оба атрибута столбца (метку и имена), которые мне нужно сохранить.

Я также пробовал довольно много функций из sjlabelled , с пометкой и гавань пакетов.Ничто не сработало, как я хотел.Наконец, я нашел решение, но оно не идеально, и я хотел бы найти более простой способ сделать это.

Решение состоит в том, чтобы потерять эти атрибуты, но затем восстановить (фактически «копировать»)их.

data <- data %>%
  mutate(A1 = factor(A1, levels = c("c", "a", "b")),
         A3 = factor(A3, levels = c("h", "g", "i"))) %>%
  copy_labels(data)

copy_labels - это функция из пакета sjlabelled , которая используется в случае потери меток, например, из-за поднабора данных, как в в этом примере .

PS Я хотел бы добавить теги r-sjlabelled и r-label , потому что эти пакеты рассматриваются в этой проблеме, но для этого требуется менее 1500 репутации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...