背景: - 具有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))
答案 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, ]