因子水平虚拟变量 R

Factor levels dummy variable R

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

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)

可能对 R 中的因子有一些混淆。它们是一种以允许传统统计模型将它们用作输入的形式表示非数值的方式(例如线性建模)。因素有一组固定的 'levels'(对于计算机),每个因素都有一个 'label'(对于人类)。但是,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 自动为线性模型创建虚拟变量,但如果您想设计自己的功能(例如创建 'dementia' 列),它不会提供额外的好处。

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

wt.loss = grepl("w[^ ]*t loss",x)
wt.loss
#> [1]  TRUE FALSE  TRUE  TRUE
  • grepl 是一个逻辑 grep(其中 grep 是一个搜索函数)所以它将 return TRUE/FALSE
  • "w[^ ]*t loss" 搜索看起来像 "w(any non space character repeated 0 or more times)t loss" 的子字符串,因此它将匹配 "wt loss" 或 "weight loss".
  • x 指定要搜索的向量。

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