好吧,我是一个初学者,在充分制定问题时遇到了问题,所以如果我能在其他地方找到答案,请重定向我,并原谅我:(
我正在处理一个杂乱的大数据患者文件(超过4000万行(。每个患者(id(都有几行。每一行(大致(代表一次带有症状/疾病代码(icpc(的咨询。我想在他们的一次会诊/行中,将数据集减少到所有有特定疾病的患者行(icpc(,但也保留这些患者的所有有其他疾病的行。我还想保留该栏的注册日期。
我的原始数据.frame(x(看起来像这样(这是伪造的数据,id在我的数据集中要长得多,我遗漏了我喜欢删除的不相关列(:
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
100 B10 01JUN2017
100 A04 11JAN2008
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
假设我只想将D95和/或A01患者保留在数据集中。我已经管理了子集:
subset(x, ICPC == c("D95", "A01"))
但这只剩下D95和A01注册的咨询:
id icpc reg.date
123 D95 19JUN2015
332 A01 16MAR2010
113 D95 16JAN2013
113 A01 01MAY2009
551 D95 09MAY2015
这是我想要的数据帧:
id icpc reg.date
123 D95 19JUN2015
123 F85 15AUG2016
332 A01 16MAR2010
332 A04 20JAN2018
332 K20 20FEB2017
113 T08 18MAR2018
113 P28 19JAN2017
113 D95 16JAN2013
113 A01 01MAY2009
551 B12 03APR2011
551 D95 09MAY2015
如有任何帮助,我们将不胜感激。非常感谢。
使用base
,因为您指定了subset
df_2 <- by(df, df$id, function(x) subset(x, any(x$icpc %in% c("D95", "A01"))))
df_2 <- do.call(rbind, lapply(df_2, data.frame))
row.names(df_2) <- NULL
id icpc reg.date
1 113 T08 18MAR2018
2 113 P28 19JAN2017
3 113 D95 16JAN2013
4 113 A01 01MAY2009
5 123 D95 19JUN2015
6 123 F85 15AUG2016
7 332 A01 16MAR2010
8 332 A04 20JAN2018
9 332 K20 20FEB2017
10 551 B12 03APR2011
11 551 D95 09MAY2015
使用dplyr
-在我看来要容易得多,但使用filter
而不是subset
library(dplyr)
df %>%
group_by(id) %>%
filter(any(icpc %in% c("D95", "A01")))
id icpc reg.date
<dbl> <chr> <chr>
1 123 D95 19JUN2015
2 123 F85 15AUG2016
3 332 A01 16MAR2010
4 332 A04 20JAN2018
5 332 K20 20FEB2017
6 113 T08 18MAR2018
7 113 P28 19JAN2017
8 113 D95 16JAN2013
9 113 A01 01MAY2009
10 551 B12 03APR2011
11 551 D95 09MAY2015