因子水平虚拟变量R

因子水平虚拟变量R,r,factors,dummy-variable,R,Factors,Dummy Variable,当我从列表中创建因子时,我不确定是否应该包含级别: random_merge_patients$MedCond <-factor(sort(random_merge_patients[[35]])) 如果应该选择级别,我会选择什么?谁能澄清一下,因为这让我很困惑 我将使用此变量创建一个虚拟变量,但即使我没有收到错误消息,$detaminia中的所有值都是0,但有些值应该是1: random_merge_patients$'MedCond_Dementia'<-ifelse(rand

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

random_merge_patients$MedCond <-factor(sort(random_merge_patients[[35]]))
如果应该选择级别,我会选择什么?谁能澄清一下,因为这让我很困惑

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

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

random\u merge\u患者$'MedCond\u demidenia'对于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会自动创建级别并按字母顺序为这些级别分配标签(因此您的
排序
是不相关的)。请注意
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(“痴呆症”,x)
。如果有多个术语基本上都是同一个意思,你可以用它们来标记一个或多个条件(例如,
grepl(“骨质疏松症,骨骼中的钙丢失”,x)
)。

你的例子对于真正的帮助来说有点少,但我建议,考虑到你的例子
MedCond
,这些因素确实是不合适的。我建议将它们保留为
字符
,并使用类似
c$MedCond\u痴呆症标记的东西,非常好的解释,非常感谢。这证实了我们的想法,并且成功了。我不能投票给你,因为我是这个网站的新手,但谢谢你。htn@coding_is_fun你可以接受答案(这也给了你声誉)。另外-您不需要第二条
ifelse
语句-如果需要,二进制将自动转换为数字1/0。尝试
TRUE+TRUE==2
wt.loss = grepl("w[^ ]*t loss",x)
wt.loss
#> [1]  TRUE FALSE  TRUE  TRUE