【问题标题】:Concatenating multiple character elements from variable and recoding as 0 and 1连接变量中的多个字符元素并重新编码为 0 和 1
【发布时间】:2018-12-03 21:11:02
【问题描述】:

我正在尝试从一长串元素中创建两个新变量,并将它们重新编码为 0 和 1 以在逻辑回归中运行。也就是说,调查中的 OS1 变量表示受访者完成调查的操作系统。我想将移动设备重新编码为“移动设备”,将电脑上的设备重新编码为“PC”。我尝试使用 dplyr::case_when(),但它的行为似乎不像其他变量,我不必对其进行子分类。我的目标是在下面显示的管道运算符中执行此操作。

作为一个例子,我展示了我如何过滤 Campus A 和激励类型。然后我如何使用 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 变异为新变量(“finished”、“grade”和“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")

个人电脑:

"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 有两个级别:移动和 PC。也就是说,操作系统(使用您的手机或个人电脑)是否会影响受访者是否完成调查。

提前致谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这将创建两个新列 mobilepc,编码为 TRUE/FALSE:

    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)
    

    【讨论】:

    • 谢谢!让我试试这个。
    • 所以当我运行这个时,我首先选择了“移动”。截距 1.8 和 mobileTRUE -0.79。然后我用“pc”再次运行它。拦截 1.08 和 pcTRUE .79。也就是说,它们是相同的值,一负一正。对吗?
    • 如果移动和个人电脑是唯一的操作系统并且每条记录都是其中之一,那是有道理的。在这种情况下,您的模型中实际上只需要其中一个,因为 mobile = TRUE 的每个情况也是 pc = FALSE 的情况,反之亦然。
    • 谢谢。我不确定,因为截距不同,但绝对系数相同。但这是有道理的,因为只有两个可能的值,pc 或 mobile。
    【解决方案2】:

    我可能会使用被严重低估的%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))
    

    编辑:我的基本上是上面 Jordo82 所做的 base-R 版本。

    【讨论】:

    • 谢谢!我从来没有见过这样做的。我也试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多