R:转换函数返回错误值

R: Cast function returning wrong values

背景: - 包含 60.000 行的数据框 - 5 列:pt/bi/sx/ex/re - pt = 主题;双=出生; sx = 性别; ex =考试(14种); re = 考试结果

> head(fim)
   pct  nasc        sex     exam    res
1  ACF  11/09/1951  F       ldl     81
2  ACF  11/09/1951  F       colt    172
3  ACF  11/09/1951  F       tg      152
4  ACF  11/09/1951  F       ferr    28,1
5  ACF  11/09/1951  F       fe      41
6  ACF  11/09/1951  F       plq     256000
...

所以..如您所见,每个科目至少有​​ 14 行,对应 14 项考试及其结果。

我的问题是我想根据检查结果对所有患者及其检查集进行子集化。一个例子:我想要所有科目和他们的考试集 exam1 == 15 或 "positive".

尽管尝试了多种方法,但我认为唯一可行的解​​决方案是通过转换为宽格式,再次选择和整形。但是当我使用 cast 函数时,所有值都发生了变化:

library(reshape)
df_wide <- cast(df, pt~ex)

从长到宽工作正常,但原始值丢失到新值。谁能帮我解决这个问题,或者对我如何以另一种方式对其进行子集化有其他想法?

> head(dfw)
    pct     hcv     ldl     colt    cr      ferr    fe...
1   AFC     R       73      157     9,56    1687,0  80
2   AAPS    R       78      130     0,91    879,0   104 
3   ASS     R       96      151     0,76    666,2   138
4   ARS     R       67      115     0,73    674,0   133
5   ARDS    R       180     261     0,71    105,0   110
...

解决方案:

keep <- dfw[dfw$exam == "hcv" & fim$res == "R", "pct"]
dfw = dfw[!duplicated(dfw), ]
subset_dfw <- filter(dfw, pct %in% keep)
subset_dfw %>% group_by(pct) %>% filter (!duplicated(exam))

您可能需要考虑 dplyr 库,它提供了非常好的操作数据的选项。对于此任务,您可以尝试这样的操作:

library(dplyr)
df <- filter(df, ex == 'ex1' & re == 15)

如果你想使用基础包,你可以这样做:

df <- df[df$ex == 'ex1' & df$re == 15, ]

编辑:

如果目标是保留患者的所有行,只要任何一行有 ex1 和 15,您可以按如下方式实现:

library(dplyr)
ptToKeep <- filter(df, ex == 'ex1' & re == 15)$pt
df <- filter(df, pt %in% ptToKeep)

或者,使用如上评论所示的基础:

ptToKeep <- df[df$ex == 'ex1' & df$re == 15, ]$pt
df <- df[pt %in% ptToKeep, ]