Свертывание многофакторных уровней (беспорядочных) символьных переменных в R - PullRequest
0 голосов
/ 30 марта 2020

Я изо всех сил пытаюсь свернуть несколько уровней факторов только в три уровня факторов одной указанной c переменной в R Studio.

Моя точка отправления - data.table с 250 переменными и примерно 4000 строк. Для одной факторной переменной я хочу объединить ее 75 уровней в 3 уровня. Более того, из 75 уровней 4 уровня следует игнорировать (или предварительно установить значение NA), поскольку они содержат противоречивую информацию. Эта факторная переменная основана на ответах на опрос, которые также включают отдельные ответы в текстовом формате. Иногда даже язык отличается. Итак, это немного грязно.

Я пытался свести эти 75 уровней (или 71 уровень, если соответствующие наблюдения установлены на NA ранее) в 3 двумя разными способами. Однако R всегда возвращает + вместо > в консоли, и я не могу продолжать выполнять какие-либо другие команды. Конечно, я могу остановить это, нажав Esc, но это не поможет мне получить желаемый результат.

Итак, этот воображаемый пример должен показать то, что я пробовал:

1) с помощью levels и list функции

levels(dt$x) <- list("No"=c("I don't allow anything", "..."), 
"Yes"= c("Number of visitors ,annual sales, sales growth, number of customers", "Net sales", "..."), 
"Maybe"=c("The CEO's approval is needed.", "To be discussed"))

2) с использованием пакета forcats

dt$x %>%
fct_collapse(No= c("I don't allow anything", "..."), 
Yes= c("Number of visitors ,annual sales, sales growth", "number of customers", "Net sales", "..."), 
Maybe=c("The CEO's approval is needed.", "To be discussed"))

Я предполагаю, что проблема возникает из-за структуры исходной переменной. У кого-нибудь есть идеи, как я могу решить эту проблему?

Большое спасибо заранее!

Best, Ilka

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Мой друг фактически дал ответ. Это не имеет ничего общего со структурой данных.

Это делает работу:

dt$x <- fct_collapse(dt$x, 
                          No = c(
                            "I don't allow anything", 
                             "..."),
                          Yes= c(
                             "Number of visitors ,annual sales, sales growth",
                             "number of customers", 
                             "Net sales", 
                             "..."),
                          Maybe= c(
                              "The CEO's approval is needed.", 
                              "To be discussed")
                               )

Я до сих пор не знаю, почему первый вариант, который я разместил выше, не работает (он сделал отлично с другой переменной).

0 голосов
/ 02 мая 2020

Я написал функцию xfactor на github, чтобы помочь именно в такой ситуации. Он позволяет перекодировать уровни факторов с сопоставлением регулярных выражений, поэтому может быть полезен для работы с грязными данными. Это также позволяет вам отбрасывать уровни факторов при сопоставлении с регулярным выражением, используя оператор 'exclude'.

devtools::install_github("jwilliman/xfactor")
library(xfactor)

dt$x <- xfactor::xfactor(dt$x, levels = c(
  No = "don't|never",
  Yes = "sales|visitors|customers",
  Maybe = "approval|discuss"),
  exclude = "irrelevant", ignore.case = TRUE)
  )

См. { ссылка } для дальнейших примеров.

Кстати , если R возвращает + вместо > в консоли, вы, вероятно, пропустили закрытие ) или " где-то!

0 голосов
/ 30 марта 2020

dt $ x, безусловно, является «фактором». Чтобы назначить разные значения столбцу фактора, сначала необходимо преобразовать данные в тип «символ»

class(dt$x) # should be factor
dt$x <- as.character(dt$x)
class(dt$x) # should be "character"  

# a list of collapsed Categories
toCollapseCategories <- list(
    "No"=c("I don't allow anything", "..."), 
    "Yes"= c("Number of visitors ,annual sales, sales growth, number of customers", "Net 
           sales", "..."), 
    "Maybe"=c("The CEO's approval is needed.", "To be discussed")
)

dt$x[dt$x %in% toCollapseCategories$No] <- "No"
dt$x[dt$x %in% toCollapseCategories$Yes] <- "Yes"
dt$x[dt$x %in% toCollapseCategories$Maybe] <- "Maybe"

# and then get a factor
dt$x <- as.factor(dt$x)
class(dt$x) # factor

Конечно, код можно оптимизировать, но для замены элементов * 1004 должен быть символ dt $ x. *

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