Объединение нескольких символьных элементов из переменной и перекодирование в 0 и 1 - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать две новые переменные из длинного списка элементов И перекодировать их в 0 и 1 для запуска в логистической регрессии.То есть переменная OS1 в опросе указывает операционную систему, в которой респондент завершил опрос.Я хотел бы перекодировать те, которые являются мобильными, как «мобильные», а те, что на ПК, как «ПК».Я пытался использовать dplyr :: case_when (), но, похоже, не вел себя так же, как другие переменные, которые мне не нужно было подразделять по категориям.Моя цель - сделать это с помощью оператора трубопровода, который я покажу ниже.

В качестве примера я покажу, как я отфильтровал кампус А и тип стимула.И затем, как я создал три новых переменных столбца (готово, класс и стимул), используя dplyr :: case_when ().

survey <- seru %>% 
select(FINISHED, WC001_INCENTIVE, LEVEL, OS1, CAMPUS_Supplemental) %>%
filter(CAMPUS_Supplemental == "Campus") %>%
filter(WC001_INCENTIVE %in% c("A chance to win one of ten $100 Visa   
gift cards", "A chance to win one of three $500 Visa gift cards",
     "I wanted my opinions to be heard by faculty, staff, and 
the administration")) %>%
mutate(finished = factor(dplyr::case_when(
FINISHED  == "0" ~ 0,
FINISHED == "1" ~ 1
), levels = c(0:1), labels = c("No", "Yes"))) %>%
mutate(grade = factor(dplyr::case_when(
LEVEL == "Freshman" ~ 0,
LEVEL == "Sophomore" ~ 1, 
LEVEL == "Junior" ~ 2,
LEVEL == "Senior" ~ 3
), levels = c(0:3), labels = c("freshman", "sophomore", "junior",     
"senior"))) %>%
mutate(incentive = factor(dplyr::case_when(
WC001_INCENTIVE == "A chance to win one of ten $100 Visa gift cards" ~ 
0, WC001_INCENTIVE == "A chance to win one of three $500 Visa gift  
cards" ~ 1,
WC001_INCENTIVE == "I wanted my opinions to be heard by 
faculty, staff, and the administration" ~ 2
), levels = c(0:2), labels = c("$100 gift card", "$500 gift card", 
"Opinion heard")))

Вот структура фрейма данных.Опять же, я мутировал FINISHED, LEVEL и WC001_INCENTIVE в новые переменные («закончено», «оценка» и «стимул»).

 str(survey)
 'data.frame':  4999 obs. of  8 variables:
 $ FINISHED           : int  1 1 1 0 1 1 0 1 1 0 ...

 $ WC001_INCENTIVE    : Factor w/ 6 levels " ","  Strongly agree",..: 4 
   4 4 4 4 3 5 5 4 4 ...
 $ LEVEL              : Factor w/ 5 levels "","Freshman",..: 3 2 5 2 4 
    2 5 2 5 2 ...
 $ OS1                : Factor w/ 44 levels " ","Android 4.1.2",..: 12 
    37 34 31 40 31 12 37 37 31 ...

 $ CAMPUS_Supplemental: Factor w/ 5 levels "","Campus A","Campus B",..: 
   3 3 3 3 3 3 3 3 3 3 ...

 $ finished  : Factor w/ 2 levels "No","Yes": 2 2 2 1 2 2 1 2 2    
   1 ...

 $ grade  : Factor w/ 4 levels "freshman","sophomore",..: 3 1 2 1 4 1 2 
    1 2 1 ...

 $ incentive : Factor w/ 3 levels "$100 gift card",..: 2 2 2 2 
     2 1 3 3 2 2 ...

Так же, как я делал с «стимулом» и «оценкой»,Я хочу создать две новые переменные, «mobile» и «pc» в качестве под-переменных для OS1, то есть объединить все мобильные операционные системы в одну переменную, а операционные системы pc - в другую.Я посмотрел на другие потоки, но все они указывают на создание переменной с помощью функции c ().Мне нужно, чтобы мой был под-переменной OS1, поэтому я хотел бы включить это в оператор трубопровода выше.

Мобильный:

 c("iPhone", 'Windows Phone 10.0", "Windows Phone 8.1",   
 "Android 4.1.2", "Android 4.3", "Android 4.4.2", "Android 4.4.4",    
 "Android 5.0", "Android 5.0.1", "Android 5.0.2", "Android 5.1", 
 "Android 5.1.1", "Android 6.0", "Android 6.0.1", "Android 7.0", 
 "Android 7.1.1", "Android 7.1.2")

PC:

"Windows NT 10.0", "Windows NT 5.1", "Windows NT 6.0", "Windows NT 
6.1", "Windows NT 6.2", "Windows NT 6.3", "Macintosh"

Конечная цель - выполнить логистическую регрессию, где OS1 имеет два уровня: мобильный и компьютерный.То есть, повлияла ли операционная система (с помощью телефона или персонального компьютера) на то, закончил ли респондент опрос.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я бы, вероятно, просто решил вашу проблему с помощью сильно недооцененной команды %in%, например так:

mobile <- c("iPhone", 
            "Windows Phone 10.0", "Windows Phone 8.1", 
            "Android 4.1.2", "Android 4.3", "Android 4.4.2", "Android 4.4.4", 
            "Android 5.0", "Android 5.0.1", "Android 5.0.2", "Android 5.1", "Android 5.1.1", 
            "Android 6.0", "Android 6.0.1", 
            "Android 7.0", "Android 7.1.1", "Android 7.1.2")

pc <- c("Windows NT 10.0", "Windows NT 5.1", 
        "Windows NT 6.0", "Windows NT 6.1", "Windows NT 6.2", "Windows NT 6.3", 
        "Macintosh")

os <- c(mobile, pc)

newos <- ifelse(os %in% mobile, "mobile", ifelse(os %in% pc, "pc", NA))

РЕДАКТИРОВАТЬ: моя в основном версия base-R того, что делал Jordo82, выше.

0 голосов
/ 04 декабря 2018

Это создаст два новых столбца mobile и pc, закодированные как ИСТИНА / ЛОЖЬ:

library(tidyverse)

MobileOS <- c("iPhone", "Windows Phone 10.0", "Windows Phone 8.1",
              "Android 4.1.2", "Android 4.3", "Android 4.4.2", "Android 4.4.4",    
              "Android 5.0", "Android 5.0.1", "Android 5.0.2", "Android 5.1", 
              "Android 5.1.1", "Android 6.0", "Android 6.0.1", "Android 7.0", 
              "Android 7.1.1", "Android 7.1.2")

PCOS <- c("Windows NT 10.0", "Windows NT 5.1", "Windows NT 6.0", "Windows NT 6.1", 
          "Windows NT 6.2", "Windows NT 6.3", "Macintosh")

seru %>%
  mutate(mobile = OS1 %in% MobileOS,
         pc = OS1 %in% PCOS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...