【问题标题】:Factor levels dummy variable R因子水平虚拟变量 R
【发布时间】:2017-11-11 05:04:42
【问题描述】:

我不确定在从列表中创建因子时是否应该包含级别:

random_merge_patients$MedCond <-factor(sort(random_merge_patients[[35]]))

因子示例如下所示:

[6589] "wt loss  ftt arthritis anemia of chronic disease mild cognitive impairment  hx gout  dehydration prednisone therapy long term med use"

如果应该选择关卡,我会选择什么?任何人都可以澄清一下,因为这让我感到困惑。

我将使用这个变量来创建一个虚拟变量,但即使我没有收到错误消息,$Dementia 中的所有值都是 0,但有些应该是 1:

random_merge_patients$'MedCond_Dementia'<-ifelse(random_merge_patients$'MedCond' == "dementia",1,0)

【问题讨论】:

  • 你的例子对于真正的帮助来说有点稀疏,但我建议你的例子MedCond,因素真的不合适。我建议将它们保留为character,并使用c$MedCond_Dementia &lt;- grepl("\\bdementia\\b", x$MedCond, ignore.case=TRUE) 之类的东西,因为...=="dementia" 不能作为“字符串包含...”工作。

标签: r factors dummy-variable


【解决方案1】:

对于 R 中的哪些因子可能存在一些混淆。它们是一种以允许传统统计模型将其用作输入(例如线性建模)的形式表示非数字值的方式。因素有一组固定的“水平”(用于计算机),每个水平都有一个“标签”(用于人类)。但是,R 并不直觉应该为标签提取字符串的哪些方面。

考虑一下这个小案例。

x = c("wt loss ftt arthritis anemia of chronic disease",
      "sleep loss ftt dementia",
      "wt loss ftt arthritis anemia of chronic disease",
      "wt loss ftt demntia")

f = factor(x)
f
#> [1] wt loss ftt arthritis anemia of chronic disease sleep loss ftt dementia
#> [3] [3] wt loss ftt arthritis anemia of chronic disease wt loss ftt demntia
#> 3 Levels: sleep loss ftt dementia ... wt loss ftt demntia

我们的原始向量的长度为 4,它包含 3 个唯一的字符串。当我们将其转换为因子时,R 会自动创建级别并按字母顺序为这些级别分配标签(因此您的 sort 无关紧要)。请注意x 中的第一个值如何以“wt loss”开头,但第一个级别以sleep 开头。 R 创建了 3 个级别,因为有 3 个唯一值并接受原始字符串作为标签。在这一点上,我们的因式向量实际上只是一个整数向量,可以将标签映射到这些整数上。

as.numeric(f)
#> [1] 2 1 2 3

再次注意级别(数字部分)是如何按字母顺序创建的。因此,获取字符串并将其转换为因子有助于 R 自动为线性模型创建虚拟变量,但如果您想设计自己的特征(例如创建“痴呆症”列),它不会提供额外的好处。

对于这种情况下的特征工程,您最好查看正则表达式。例如,如果我想创建一个编码减肥的向量,我可以这样做:

wt.loss = grepl("w[^ ]*t loss",x)
wt.loss
#> [1]  TRUE FALSE  TRUE  TRUE
  • grepl 是一个逻辑 grep(其中 grep 是一个搜索函数)所以它将返回 TRUE/FALSE
  • "w[^ ]*t loss" 搜索看起来像“w(任何非空格字符重复 0 次或多次)t loss”的子字符串,因此它将匹配“wt loss”或“weight loss”。
  • x 指定要搜索的向量。

您可以针对想要设计的任意数量的功能执行此操作。搜索痴呆症将是grepl("dementia",x)。如果有多个术语基本上都意味着相同的东西,你可以使用 |标记一个或条件(例如grepl("osteoperosis|calcium loss in bones",x))。

【讨论】:

  • 马克,很好的解释,非常感谢。这证实了他的想法并且奏效了。我不能投票给你,因为我是该网站的新手,但谢谢。 htn
  • @coding_is_fun 您可以接受答案(这也会给您带来声誉)。此外 - 您不需要第二条 ifelse 语句 - 如果需要,二进制将自动转换为数字 1/0。试试TRUE+TRUE==2
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多