R:Cast函数返回错误的值

时间:2016-01-10 18:34:20

标签: r casting reshape tidyr

背景: - 具有60.000行的数据帧 - 5列:pt / bi / sx / ex / re - pt = subject; bi =出生; 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门考试及其成绩。

我的问题是我想根据考试结果对所有患者及其考试进行分组。一个例子:我希望所有科目和他们的考试都有考试1 == 15或"肯定"。

尽管已经尝试了几种方法,但我认为唯一可行的解​​决方案是通过转换为宽幅格式,再次选择和重塑。但是当我使用强制转换功能时,所有值都会改变:

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))

1 个答案:

答案 0 :(得分:3)

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

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

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

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

编辑:

如果目标是为患者保留所有行,只要任何一行具有ex1&amp; 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, ]