r语言 - 用if_else和mutate函数重新编码一个变量,但是它创建了比应该可能的更多的答案



我的数据集的一个样本:https://i.stack.imgur.com/AYLAg.png

> str(df_nr_axspa)
'data.frame':   6522 obs. of  3 variables:
 $ asas_criteria    : Factor w/ 2 levels "0","1": 2 2 NA 2 2 2 2 1 2 2 ...
 $ new_york_criteria: Factor w/ 2 levels "0","1": 2 2 NA 2 NA 2 1 1 2 2 ...
 $ nr_axspa         : num  0 0 NA 0 NA 0 1 2 0 0 ...

我想重新编码一个变量,我想叫它nr-axspa。这个变量是一种诊断,是脊椎关节炎的一个亚型,是一种风湿性疾病。根据ASAS和New York的分类标准可以推断诊断。

如果患者在ASAS中为1,但在纽约为0,则他/她患有nr-axspa,否则没有(在这种情况下为r-axspa)。我将所有有nr-axspa的人编码为"1",所有没有nr-axspa的人编码为"0"。还有一些是美国标准协会0分,纽约是0到2分。这是我使用的代码:

df_nr_axspa <- mutate(df, nr_axspa = if_else(asas_criteria == 0 & new_york_criteria == 0, 2, 
                                             if_else(asas_criteria == 1 & new_york_criteria == 0, 1, 0)))

有趣的是,当我查看summary(df_nr_axspa$nr_axspa)时,我发现有1596名患者被诊断。然而,我原本预计只有1434例。

当我创建一个包含ASAS标准和New York标准的2x2表时,它给出了这些数字:

<table>
<tbody>
<tr>
<td>&nbsp;</td>
<td>New York</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>ASAS</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>0</td>
<td>20</td>
<td>50</td>
</tr>
<tr>
<td>1</td>
<td>372</td>
<td>992</td>
</tr>
</tbody>
</table>

所以根据这个表,应该有20名患者没有诊断或组为"2",372名患者诊断为"1"。或";nr-axspa"1042例患者为"0"或"r-axspa".

但是,新编码的变量"1"的频率为372,"2"的频率为20。但是1204代表"0"。所以这个组" 1 "组&;2&;已被正确分类,但组的"0";我们突然有了162个这样的病人。

我用来确定新编码变量

的频率的代码
describe(df_nr_ax_spa$nr_ax_spa)

所以我想弄清楚到底发生了什么。当我手动查看数据时,我似乎找不到新变量编码方式的任何错误。有人能解释一下吗?

提前感谢!

我想知道mutate + case_when会为你工作吗?

df_nr_axspa <- df_nr_axspa %>%
  mutate(nr_axspa = case_when(
    asas_criteria = 0 & new_york_criteria == 0 ~ 2,
    asas_criteria = 1 & new_york_criteria == 0 ~ 1))

也许另一个答案可以帮助你理解你的其他代码出了什么问题。也许是NA值造成了问题;我不确定。

使用标准作为因子,使用数字作为名称,很容易出现问题。你可以在你的"str"输出来自个体的值与级别不匹配。改变你的if_else在数字周围加上引号,例如

df_nr_axspa <- mutate(df, nr_axspa = if_else(asas_criteria == "0" & new_york_criteria == "0", 2, 
                                             if_else(asas_criteria == "1" & new_york_criteria == "0", 1, 0)))

不确定这是不是问题。

我不建议用数字作为因子名——这会引起很大的混乱!

我明白我的问题了。当我检查符合纽约标准= 1的患者总数时,它回到1204。我突然意识到这个公式非常有效,但我计算出的应该有"r- x"的病人总数;因此纽约标准= 1,是完全错误的。所以交叉表只显示了同时患有ASAS和;纽约标准,但不包括纽约标准= 1但缺失ASAS的患者。

我设法找到了这个解决方案,因为我将if_else函数分成3部分,并将它们放在不同的向量(x1,x2,x3)中,以查看错误发生的地方。

最新更新