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, ]
背景: - 包含 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, ]