【问题标题】:How to I use a loop to change categorical data into binary data?如何使用循环将分类数据更改为二进制数据?
【发布时间】:2020-02-16 08:31:15
【问题描述】:

我有一个数据集,可以将学生成绩的提高与他们的学习方法进行比较。分类参数是学习方法,三个选项是NO(无协助)、FULL(是协助)和CHECK(根据需要协助)。要设置我的回归,我需要设置 x1=1,如果学生有充分的帮助,否则 x1=0。如果学生被标记为 CHECK,我还需要设置 x2=1,否则设置 x2=0。对于没有帮助,我也需要做同样的事情(如果 ASSIST='NO',则 x3=1,否则 x3=0)。这是我正在尝试做的事情:

if (ACCHW$ASSIST<-"FULL") { x1=1
} else {
x1=0
}

但我收到错误:if (ACCHW$ASSIST

我是在 R 中创建循环的新手,非常感谢您的建议!

【问题讨论】:

  • &lt;- 是赋值运算符而不是比较器,例如 ==!= &lt;= 等。这是你的第一个问题。你的意思是&lt;=
  • 这里似乎不需要循环。试试x1 = ifelse(ACCH$ASSIST == "FULL", 1, 0)
  • 我试过这个。当我运行回归 p4.53=lm(ACCHW$IMPROVE~x1 +x2, data=ACCHW) summary(p4.53) 我没有得到 beta 估计值...我需要 beta 估计值。

标签: r loops data-manipulation


【解决方案1】:

创建一个新的数据框就足够了,将ASSIST 与它的每个值进行比较,并将cbind 与原始数据框进行比较。使用以下数据:

ACCHW <- data.frame(ASSIST = c("NO", "FULL", "CHECK"), stringsAsFactors = F)

试试这个:

cbind(ACCHW,
      data.frame(x1 = ACCHW$ASSIST == "NO",
                 x2 = ACCHW$ASSIST == "FULL",
                 x3 = ACCHW$ASSIST == "CHECK"
                 )
      )

#### OUTPUT ####

  ASSIST    x1    x2    x3
1     NO  TRUE FALSE FALSE
2   FULL FALSE  TRUE FALSE
3  CHECK FALSE FALSE  TRUE

记住TRUE == 1FALSE == 0。如果您真的想要 0 和 1,请执行与上述相同的操作,但使用 as.integer

cbind(ACCHW,
      data.frame(x1 = as.integer(ACCHW$ASSIST == "NO"),
                 x2 = as.integer(ACCHW$ASSIST == "FULL"),
                 x3 = as.integer(ACCHW$ASSIST == "CHECK")
                 )
      )

【讨论】:

  • 当我尝试在 lm 函数中运行它时,找不到对象 x1。我需要创建一个看起来像这样的模型:Y(改进分数)= Bo + B1 X1(全力协助)+ B2 X2(检查)。
  • @valarievil 我不知道您是如何编写公式的,但x1 肯定存在。 R 区分大小写 - 您使用的是正确的 x1 还是 X1
  • 大写不是问题。代码:x1 = ifelse(ACCHW$ASSIST == "FULL", 1, 0) x2 = ifelse(ACCHW$ASSIST == "CHECK", 1, 0) #cbind(ACCHW, # data.frame(x1 = as .integer(ACCHW$ASSIST == "NO"), # x2 = as.integer(ACCHW$ASSIST == "FULL"), # x3 = as.integer(ACCHW$ASSIST == "CHECK") # ) # ) p4.53=lm(ACCHW$IMPROVE~x1 +x2, data=ACCHW) summary(p4.53) alias(p4.53) #不给我 x1 和 x2 的 beta 系数
  • @valarievil 当我用自己的数据对其进行测试时,一切正常,因此问题似乎与我的解决方案无关。检查您的代码是否存在语法错误,并确保您的数据适合多元回归。
【解决方案2】:

这是一个 dplyr 替代方案!

library(dplyr)

df <- tibble(ASSIST = c("NO", "FULL", "CHECK"))

df %>% 
  mutate(x1 = ASSIST == "NO",
         x2 = ASSIST == "FULL",
         x3 = ASSIST == "CHECK") %>% 
  mutate_at(c("x1", "x2", "x3"), as.integer) # Converts to binary

【讨论】:

    【解决方案3】:

    基础 R 解决方案:

    cbind(ASSIST = ACCHW$ASSIST, data.frame(lapply(data.frame(setNames(
      sapply(ACCHW$ASSIST, `==`, ACCHW$ASSIST),
             c(names(ACCHW), ACCHW$ASSIST))), as.integer)))
    

    数据感谢(@gersht):

    ACCHW <- data.frame(ASSIST = c("NO", "FULL", "CHECK"), stringsAsFactors = FALSE)
    

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 2021-06-30
      • 2017-07-15
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2019-01-28
      • 2014-04-19
      • 2016-03-18
      相关资源
      最近更新 更多