因子水平虚拟变量R.

时间:2017-11-11 05:04:43

标签: r factors dummy-variable

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

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)

1 个答案:

答案 0 :(得分:2)

对于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次或更多次)丢失”的子字符串,因此它会匹配“wt loss”或“weight loss”。
  • x指定要搜索的向量。

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