【问题标题】:Recoding character variables within the pipe operator在管道运算符中重新编码字符变量
【发布时间】:2019-05-02 04:09:58
【问题描述】:

我正在尝试根据调查数据集构建逻辑回归模型。我有兴趣查看激励类型(例如礼品卡)和学生年级(大一、大二等)的影响,以预测她/他是否完成了调查。数据框有数百个变量,所以我的第一步是只使用我需要的,在tidyverse中使用管道运算符:

1) 选择四个感兴趣的变量:如果学生完成了调查(FINISHED)、校园位置(CAMPUS)、激励类型(INCENTIVE)和每个学生的年级(LEVEL) )。

2) 过滤仅来自一个感兴趣的校园(“smith”)和过滤只查看三种激励类型,因为“其他”不是很有意义在这种情况下。

我尝试运行模型,但在我将字符串重新编码为数字变量(0、1、2...)并指定它们是因子之前,它不会工作。我在其他论坛上广泛阅读,您可以对每个变量使用“as.factor”和“recode”。但是对每个变量都这样做似乎很麻烦,分配给一个新的变量,并做同样的事情来设置as.factor。

我能否将管道运算符中的字符串重新编码为数字变量(例如,新生 = 0、大二 = 1、初中 = 2 等),然后使用 as.factor() 将其设置为因子?我尝试在管道操作员中执行此操作,但我收到一条错误消息作为回报。还是在过滤之前需要做这些操作?

任何人都可以提供任何指示吗?以下是我正在使用的代码:

survey <- read.csv("SURVEY2017.csv")

survey1 <- survey %>% 
  select(FINISHED, CAMPUS, INCENTIVE, LEVEL) %>%
  filter(CAMPUS == "smith") %>%
  filter(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"))

model <- glm(FINISHED ~ INCENTIVE + LEVEL, family = "binomial", 
data = survey1)

谢谢!

【问题讨论】:

  • 请包含可重现的样本数据。这将使其他人更容易提供有针对性的帮助;另请参阅如何提供minimal reproducible example/attempt
  • 您能解释一下为什么需要将LEVEL 变量重新编码为数字吗?对我来说... %&gt;% mutate(LEVEL=factor(LEVEL,level=c("freshman","sophomore",...))) 似乎更自然(您可以将其设为有序因子,或设置连续差异对比,具体取决于您希望如何构建模型)
  • @BenBolker 谢谢,本。我认为最好将我的变量重新编码为 0、1、2 等。我想这没有必要。我会使用你提到的 mutate 函数。

标签: r tidyverse recode


【解决方案1】:

首先,为您的问题提供一个最小工作示例 (mwe) 通常是一个好主意,这将包括一个玩具数据集。

根据您的问题,您必须先将变量重新编码为数字,然后分配为因子。 dplyr 有很多方法可以做到这一点,但我真的很喜欢 dplyr::case_when(),因为有超过 2 个类别需要重新编码。然后我用factor() 包装它并指定levelslabels

library(magrittr)
library(dplyr)

data <- data.frame(FINISHED = sample(c('Y', 'N'), 1000, replace = T), 
                   CAMPUS = sample(c("smith", "campus A", "campus B"), 1000, replace = T), 
                   INCENTIVE = sample(c("Gift cards", "Heard by faculty"), 1000, replace = T), 
                   LEVEL = sample(c("freshman", "sophomore", "junior"), 1000, replace =T), 
                   stringsAsFactors = F)

data <- data %>% 
  mutate(LEVEL = factor(dplyr::case_when(
    LEVEL == "freshman" ~ 0,
    LEVEL == "sophomore" ~ 1, 
    LEVEL == "junior" ~ 2
  ), levels = c(0:2), labels = c('freshman', "sophomore", "junior")))

data 结构:

> str(data)
'data.frame':   1000 obs. of  4 variables:
 $ FINISHED : chr  "Y" "N" "Y" "N" ...
 $ CAMPUS   : chr  "campus B" "campus A" "smith" "campus B" ...
 $ INCENTIVE: chr  "Gift cards" "Heard by faculty" "Gift cards" "Gift cards" ...
 $ LEVEL    : Factor w/ 3 levels "freshman","sophomore",..: 3 3 2 2 2 1 1 2 2 2 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2013-07-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多